gpt4 book ai didi

javascript - 如何构建模块化的js promise 链?

转载 作者:行者123 更新时间:2023-12-03 07:11:20 25 4
gpt4 key购买 nike

我有一个 promise 链,当前正在运行非常基本的错误处理。如果某个步骤失败,则后续步骤将不会运行。我希望在出现故障时能够在稍后的时间继续 promise 链,并且它应该从中断的地方开始。

这就是我当前的代码:

// 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

但是也许有更好的方法来编写它以实现模块化?假设步骤 2 失败,我如何设计一种方法,以便用户可以单击按钮稍后继续步骤 2 的链?

最佳答案

看看 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 以及回调,告诉您步骤是否完成而没有错误,如果您不需要这些日志)

现在,代码中的这些 ... 是什么?正好满足你的要求

I want to be able to continue the promise chain at a later time if there is a failure

... 部分中,您需要处理错误,并返回失败步骤无错误结果的 promise ,例如通过重试。这个 promise 只会在“稍后的时间”解决 - 您可以等待用户确认错误、超时或您想要的任何内容。

一旦您从错误回调返回的 promise 得到解决,链就会继续。

关于javascript - 如何构建模块化的js promise 链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606186/

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