我已经尝试了各种各样的方法,但仍然没有弄清楚如何解决这个问题。
我有一个返回承诺的方法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(如果有任何条目)alog with error。这是我的工作代码。
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();
});