JavaScript原生Promise对两个结果执行回调

JavaScript native Promise execute callback on both results

本文关键字:两个 结果 执行 回调 原生 Promise JavaScript      更新时间:2023-09-26

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

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

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

例如,在jquery Defered中,我可以使用方法always():

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

Promise支持这样的东西吗?

没有,没有已经讨论过了,但规格很低。它不包括一堆其他功能。它的设计目的是与库承诺进行良好的互操作,并提供简单的功能。

以下是Steffanner最初提出的建议的正确polyfill。

此外,我不同意当前已删除的答案自己添加它,因为他们都做错了(作为一个可枚举属性-没有乐趣)。即使我们忽略它对返回的promise的返回值和错误状态的影响。扩展本机promise的预期方法是将其子类化,遗憾的是,目前还没有浏览器支持这一点,所以我们只能等待。

与其干扰原生原型,我们应该使用一种不同的模式:

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

我们很容易忘记关闭,即使我们在应用程序中打开它100次,忘记关闭它哪怕一次也可能是毁灭性的。另一方面,我们可以使用一些promise库提供的处理器模式:

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

基本上,这种模式意味着openDB不返回promise,而是接受一个函数返回一个promise,当函数运行时,如果它返回一个promise,我们将等待该promise得到解决。它看起来像:

function openDb(withDb){
    return justOpenWithoutCleanUp().
           then(withDb).
           then(clean, function(e){ clean(); throw e; }); // note the rethrow
}
Promise对象支持"始终"。

例如:

var oPromise=jQuery.ajax({网址:YOUR_url}).valways(function(){YOUR_CLEAN_UP_METHOD();})