gpt4 book ai didi

Javascript:如何使用 promise 迭代数组?

转载 作者:可可西里 更新时间:2023-11-01 02:22:49 26 4
gpt4 key购买 nike

LIVE DEMO

给定以下函数:

function isGood(number) {
var defer = $q.defer();

$timeout(function() {
if (<some condition on number>) {
defer.resolve();
} else {
defer.reject();
}
}, 100);

return defer.promise;
}

和一组数字(例如 [3, 9, 17, 26, 89]),我想找到第一个“好”的数字。我希望能够做到这一点:

var arr = [3, 9, 17, 26, 89];

findGoodNumber(arr).then(function(goodNumber) {
console.log('Good number found: ' + goodNumber);
}, function() {
console.log('No good numbers found');
});

这是一个可能的递归版本来实现它:DEMO

function findGoodNumber(numbers) {
var defer = $q.defer();

if (numbers.length === 0) {
defer.reject();
} else {
var num = numbers.shift();

isGood(num).then(function() {
defer.resolve(num);
}, function() {
findGoodNumber(numbers).then(defer.resolve, defer.reject)
});
}

return defer.promise;
}

我想知道是否有更好的(也许是非递归的)方法?

最佳答案

I wonder if there is a better way?

是的。避免 deferred antipattern !

function isGood(number) {
return $timeout(function() {
if (<some condition on number>) {
return number; // Resolve with the number, simplifies code below
} else {
throw new Error("…");
}
}, 100);
}
function findGoodNumber(numbers) {
if (numbers.length === 0) {
return $q.reject();
} else {
return isGood(numbers.shift()).catch(function() {
return findGoodNumber(numbers);
});
}
}

maybe non-recursive?

您可以制定一个循环,链接大量的 then 调用,但是递归在这里绝对没问题。如果你真的想要循环,它可能看起来像这样:

function findGoodNumber(numbers) {
return numbers.reduce(function(previousFinds, num) {
return previousFinds.catch(function() {
return isGood(num);
});
}, $q.reject());
}

但是这样效率较低,因为它总是查看所有数字。 “递归”版本将延迟评估它,并且仅在当前数字不好时才进行另一次迭代。

maybe faster?

您可以并行触发所有 isGood 检查,并等待第一个完成的返回。根据 isGood 的实际作用以及可并行化的程度,这可能“更好”。不过,它可能会做很多不必要的工作;您可能想要使用支持取消的 promise 库。

一个使用 Bluebird 库的例子,它有一个 any helper function致力于此任务:

function findGoodNumber(numbers) {
return Bluebird.any(numbers.map(isGood))
}

关于Javascript:如何使用 promise 迭代数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25263723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com