【问题标题】:JavaScript native Promise execute callback on both resultsJavaScript 原生 Promise 对两个结果执行回调
【发布时间】:2014-12-24 23:35:58
【问题描述】:

有没有办法对 Promise 对象的两个结果执行回调?

例如,我想在执行 xhr 请求后进行一些清理逻辑。所以我需要做这样的事情:

var cleanUp = function() { something.here(); }
myLib.makeXhr().then(cleanUp,cleanUp);

以 jquery Defered 为例,我可以使用方法 always():

myLib.makeXhr().always(function() { something.here(); });

Promise 支持这样的东西吗?

【问题讨论】:

标签: javascript promise


【解决方案1】:

不,没有。它是discussed,但规格很少。它不包括一堆其他功能。它旨在与库承诺很好地互操作并提供简单的功能。

Here is a correct polyfill of that proposal originally made by StefPanner.

此外,我不同意 current 现在删除的答案自己添加,因为他们都做错了(作为可枚举的属性 - 没有乐趣)。即使我们忽略它对返回的 Promise 的返回值和错误状态的作用。扩展原生 Promise 的预期方式是子类化它们,遗憾的是,目前还没有浏览器支持这一点,所以我们必须等待。

我们应该使用不同的模式,而不是使用原生原型:

openDb().then(foo).then(bar).finally(close).then(more);

容易导致我们忘记调用关闭,即使我们在应用程序中打开它 100 次,即使一次忘记关闭它仍然可能是毁灭性的。另一方面,我们可以使用一些 Promise 库提供的我们自己内置的 disposer 模式:

openDb(function(db){
    return foo(db).then(bar);// chain here
}).then(more);

基本上——这种模式意味着不是让openDB返回一个promise——我们让它接受一个函数并且返回一个promise,当函数运行时,如果它返回一个我们等待的promise承诺解决。它看起来像:

function openDb(withDb){
    return justOpenWithoutCleanUp().
           then(withDb).
           then(clean, function(e){ clean(); throw e; }); // note the rethrow
}

【讨论】:

    【解决方案2】:

    Promise 对象支持'always'。

    例如:

    var oPromise= jQuery.ajax({ 网址:您的网址 }).总是(函数(){ YOUR_CLEAN_UP_METHOD(); })

    【讨论】:

    • @SanketPipariya 这不是问题,而是答案
    • 不赞成票的人并没有告诉你——但他们反对你在这里使用 jQuery——这与讨论原生承诺的问题无关。
    猜你喜欢
    • 2014-06-28
    • 2019-04-29
    • 2015-07-15
    • 2023-03-23
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多