我有一个承诺链,目前正在运行非常基本的错误处理。如果步骤失败,则后续步骤将不会运行。如果发生故障,我希望能够在以后继续保证链,它应该从它停止的地方开始。
这是我目前的代码:
// controller.js
var failure = false;
QueryFactory.step1() // Step 1
.then(function(msg){
if(failure == false){
console.log("Finished Step 1");
return QueryFactory.step2();
}
}, function(err){
console.log(err);
failure = true;
})
.then(function(msg){ // Step 2
if(failure == false){
console.log("Finished Step 2");
return QueryFactory.step3();
}
}, function(err){
console.log(err);
failure = true;
})
.then(function(msg){ // Step 3
if(failure == false){
console.log("Finished Step 3");
}
}, function(err){
console.log(err);
failure = true;
})
我的工厂看起来像这样:
// QueryFactory.js
step1 = function(){
var deferred = $q.defer();
$http.post('/task', {step_num: 1})
.then(function(data)){
deferred.resolve(data);
}, function(err){
deferred.reject(err);
});
return deferred.promise;
}
// step2 and step3 are similar
但也许有更好的方法来编写这个以实现模块化?说step2失败了,我怎样才能设计一种方式让用户可以点击按钮以后再继续从step2链接?
答案 0 :(得分:1)
查看difference between .then(…).catch(…)
and .then(…, …)
。在你的情况下,通过将第二个回调传递给then
,你最终会跳过当前步骤而不是继续你离开的地方。您正在寻找的是
QueryFactory.step1()
.then(function(msg) {
console.log("Finished Step 1 without error");
return msg;
}, function(err) {
console.log(err);
…
}).then(function() {
return QueryFactory.step2();
}).then(function(msg) {
console.log("Finished Step 2 without error");
return msg;
}, function(err) {
console.log(err);
…
}).then(function() {
return QueryFactory.step3();
}).then(function(msg) {
console.log("Finished Step 3 without error");
return msg;
}, function(err) {
console.log(err);
…
}).then(function(res) {
console.log("everything is finished");
}).catch(function(err){
console.error("something bad happened", err);
});
(或者你可以使用普通的.catch
而不是then
的回调来告诉你一个步骤是否完成而没有错误,如果你不需要那些日志的话)
现在,代码中的这些…
是什么?这是符合您的要求
如果发生故障,我希望能够在以后继续保证链
在…
部分中,您需要处理错误,并返回失败步骤的无错误结果的承诺,例如:通过重试。这个承诺只会在“晚些时候”解决 - 您可以等待用户确认错误,超时或任何您想要的。
一旦你从错误回调中恢复的承诺结束,链就会继续。