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

标签 javascript promise

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

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

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

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

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

Promise 是否支持这样的东西?

最佳答案

不,没有。discussed但规范很小。它不包括一堆其他功能。它旨在与库 promise 良好地互操作并提供简单的功能。

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

此外,我不同意 current now deleted answers 添加它自己,因为他们都做错了(作为一个可枚举的属性 - 没有乐趣)。即使我们忽略它对返回的 promise 的返回值和错误状态的影响。扩展原生 promises 的预期方式是通过子类化它们,遗憾的是,目前还没有浏览器支持这种方式,所以我们将不得不等待。

我们应该使用不同的模式,而不是搞乱原生原型(prototype):

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
}

关于JavaScript 原生 Promise 对两个结果执行回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26627402/

相关文章:

javascript - 在使用html,css和javascript的简单菜单中冒泡

Typescript 柯里化(Currying)和异步函数

javascript - 如何根据包含其关键位置的数组数组生成具有嵌套键的对象?

javascript - 如何使用 jquery 更新图像

javascript - http 响应中的 Angular 奇怪行为

javascript - NodeJS Bluebird promise 在处理程序中创建但未从中返回

promise - 将 Protractor ElementFinder 传递给 deferred.fulfill() 会导致包含 null 值的 Promise

jquery - 在jquery插件中添加done()函数以等待动画完成

javascript - 等待后在 map 函数下循环序列中断

javascript - knockout : Unusual Mapping Pattern