javascript - 有没有一种好的方法可以缩短 Javascript 的 promise ?

标签 javascript promise jquery-deferred

我对 promises/Deferreds 有点陌生。对于成功和错误的情况,是否有一个好的模式来处理可能想要缩短 promise 链的情况?在错误情况下,我知道你可以将一个 .then(null, function(error) {}) 链接到最后并从之前的任何一个 then 中捕获错误,但是如果你想以更自定义的方式处理错误并终止?您是否会在较早的错误处理程序中指定错误的“类型”并通过新的 promise 返回它,以在最终的错误处理程序中处理或跳过?如果您想在链中更早地终止(仅有条件地触发任何稍后的 then)的成功案例呢?

最佳答案

通常,promise 链以调用某个异步函数开始:

var promise = callAsync();

如果你正在链接第二个异步调用,你可能会做这样的事情:

var promise = callAsync()
.then(function(){
    return callOtherAsync();
})
.then(function(){
    return callSuccessAsync();
}, function(){
    return callFailAsync();
});

作为链接的结果,promise现在包含在 callFinalAsync() 时完成的最终 promise 的 promise 完成。最后没办法短路promise使用此模式时 - 您可以沿途返回失败的 promise (例如,而不是返回 callOtherAsync 的结果),但这需要失败的 promise 通过链(从而导致调用 callFailAsync)。 您始终可以履行或拒绝 promise从这样的回调中

var promise = callAsync()
.then(function(){
    if(fail){
        promise.reject();
        //no way to halt progression 
    }else{
        return callOtherAsync();
    }
})
.then(function(){
    return callSuccessAsync();
}, function(){
    return callFailAsync();
});

但是,这不会阻止调用 callFailAsync() .一些 Promise/A 实现公开了一个 stop方法只是为了这个目的。使用 stop,你可以这样做:

var promise = callAsync();
.then(function(){
    if(fail){
        this.stop(); 
        promise.reject();
    }else{
        return callOtherAsync();
    }
})
.then(function(){
    return callSuccessAsync();
}, function(){
    return callFailAsync();
});

这取决于使用 this 访问中间 promise .一些 Promise 实现禁止这样做(强制 this 为 window/null/等),但您可以通过闭包来处理它。

TL;DR:Promise/A 规范不提供链短路功能,但添加一个并不难。

关于javascript - 有没有一种好的方法可以缩短 Javascript 的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20237921/

相关文章:

javascript - 使用 $.deferred 作为发布者/订阅者?

javascript - 谁提供了 Express 中间件中的 next() 功能?

javascript - Promise 的 then 处理程序中的同步代码

javascript - RXJS + Axios 错开网络请求

javascript - Selenium/WebdriverJs/Protractor promise 与页面对象链接

javascript - 如何构造这些嵌套的异步请求以在继续之前完成批处理?

javascript - 延迟解析始终在 try catch 内

javascript - 如果不使用 XMLHttpRequest,我们如何使用 JavaScript 跨域获取网页?有没有可以做到这一点的插件?

javascript - TypeError : Chartist.plugins.legend不是一个函数

javascript - AngularJS 中的混​​合内容