【发布时间】:2014-10-05 11:43:15
【问题描述】:
给定以下函数:
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;
}
我想知道是否有更好的(可能是非递归的)方式?
【问题讨论】:
-
好吧,既然你只对第一个好的数字感兴趣,你的方法似乎很好,否则使用
q.all的实现会更合适。但是,shift很昂贵,所以我会考虑不改变数组并简单地增加索引。函数名称中没有任何内容暗示numbers会发生变异,因此如果您坚持使用该解决方案,至少使用numbers.slice()复制它。如果您有很多数字(足以填满调用堆栈),请使用堆栈的迭代方法。 -
在检查下一个数字之前检查每个数字是否重要,还是允许一次检查所有数字以尽快找到第一个好的?
-
如果你禁止提前迭代数组,你所拥有的接近最佳解决方案,如果你可以提前迭代数组(但不检查它),这可以简化为 for 循环。
-
@Misha Moroshko 可以用他收到的号码解析 isGood 函数吗?
标签: javascript angularjs promise q angular-promise