JavaScript本机Promise在两个结果上执行回调

Yav*_*sta 6 javascript promise

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

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

var cleanUp = function() { something.here(); }
myLib.makeXhr().then(cleanUp,cleanUp);
Run Code Online (Sandbox Code Playgroud)

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

myLib.makeXhr().always(function() { something.here(); });
Run Code Online (Sandbox Code Playgroud)

Promise是否支持这样的事情?

Ben*_*aum 7

不,没有.它被讨论 ,但规格是最小的.它不包括许多其他功能.它旨在与图书馆承诺良好互操作,并提供简单的功能.

以下是StefPanner最初提出的正确的polyfill.

此外,我不同意当前现在删除的答案,因为他们都做错了(作为一个可枚举的属性 - 没有乐趣).即使我们忽略它对返回值的返回值和错误状态的作用.扩展本机承诺的预期方法是通过子类化它们,遗憾的是,没有浏览器支持它,所以我们必须等待.

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

openDb().then(foo).then(bar).finally(close).then(more);
Run Code Online (Sandbox Code Playgroud)

很容易让我们忘记打电话,即使我们在我们的应用程序中打开它100次,忘记关闭它甚至一次仍然是毁灭性的.另一方面 - 我们可以使用一些承诺库提供的处理器模式:

openDb(function(db){
    return foo(db).then(bar);// chain here
}).then(more);
Run Code Online (Sandbox Code Playgroud)

基本上 - 这种模式意味着不是openDB返回一个promise - 我们让它接受一个函数返回一个promise,当函数运行时,如果它返回一个promise,我们等待该promise的解析.它看起来像:

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