有没有办法对 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/