【发布时间】:2016-12-10 10:12:48
【问题描述】:
我已经尝试了各种方法,但仍然没有弄清楚如何解决这个问题。
我有一个返回承诺的方法iterator;此方法循环运行 x 次。我希望 iterator 返回被拒绝的承诺,而不是它应该停止执行并进入错误块。
我尝试过从this SO asnwer 采取的以下方法,但这会发送错误但执行到 x 次。
var foo = function(formdata) {
var d = $q.defer();
CallService.init()
.then(function(response) {
return CallService.fun1(formdata);
})
.then(function(response) {
var row = {1:'one', 2:'two', 3: 'three' };
var promiseArray = [];
if (<key condition true>) {
var promise = Object.keys(row).map(function(i) {
return iterator(i, row[i]).then(function(response){
promiseArray.push(response);
}, function(err){
return $q.reject(err);
});
});
return $q.all(promise); // reject if anyone is rejected, otherwise resolve
}
else {
d.reject({
message: "key condition failed."
});
}
return d.promise;
})
.then(successHandler)
.catch(errorHandler);
};
这是每个循环调用的函数
var iterator = function(num, data) {
var d = $q.defer();
CallService.fun3()
.then(function(response) {
return CallService.fun4(data)
})
.then(function(response) {
d.resolve(num);
})
.catch(function(err) {
d.reject(err);
});
return d.promise;
};
我希望 iterator 第一次发送拒绝而不是下一次发送并中断循环;
如何实现?
我也试过这种方式
var d = $q.defer();
for (var k in row) {
if (isCalled) break;
var promise = iterator(k, row[k]);
promise.then(function(response) {
promiseArray.push(response);
}, function(err) {
isCalled = true;
d.reject(err);
});
}
if (!isCalled && promiseArray.length > 0) {
console.log('after for loop', promiseArray);
d.resolve(promiseArray);
}
return d.promise;
但这也失败了。尽管有任何拒绝承诺,它总是在所有循环中执行。
编辑
我尝试过使用 .reduce 方法,但这在某种程度上可行,但我需要发送 promiseArray(如果有任何条目)与错误一起记录。这是我的工作代码。
var first_promise = $q.resolve();
var start_promise = Object.keys(row).reduce(function(promise, key){
return promise.then(function(result){
if(angular.isDefined(result)) // as first_promise results undefined
promiseArray.push(result);
return iterator(key, row[key]);
});
}, first_promise);
start_promise.then(function(res){
return $q.when(promiseArray);
}).catch(function(err){
return $q.reject();
});
【问题讨论】:
标签: javascript angularjs for-loop angular-promise