JavaScript原生Promise如何在两种结果上执行回调函数?

6
有没有办法在Promise对象的两个结果上执行回调?
例如,我想在执行xhr请求后进行一些清理逻辑。 因此,我需要像这样做:
var cleanUp = function() { something.here(); }
myLib.makeXhr().then(cleanUp,cleanUp);

例如,在jQuery的Defered中,我可以使用always()方法:
myLib.makeXhr().always(function() { something.here(); });

Promise支持类似这样的功能吗?

我看目前只有then和catch方法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 所以可能没有办法(或者扩展原型来实现)。 - Michael Plakhov
jQuery.Deferred().then,如何使用多个参数解析。https://dev59.com/r2Af5IYBdhLWcg3wZB6u - zavg
1
正如Benjamin所回答的那样 - 不行。这就是为什么我通常在浏览器中使用https://github.com/petkaantonov/bluebird及其join、all和所有其他方法。当然,它不是本地的,但它是解决许多Promise问题以及Promisification的解决方案。 - Jarema
@Jarema,除了更丰富的API和更好的堆栈跟踪之外,它目前实际上比本地承诺要快得多。 - Benjamin Gruenbaum
2个回答

7

没有,不存在。虽然这个问题已经被讨论过,但是规范很简洁,不包含很多其他的功能。它的设计目的是与库承诺良好地互操作,并提供简单的功能。

这里有一个正确的polyfill,最初由StefPanner提出

此外,我不同意那些当前现在已删除的答案自己添加它们,因为它们都做错了(作为可枚举属性-没意思)。即使我们忽略它对返回值和返回的promise的错误状态所做的影响。扩展本机promises的预期方式是通过子类化它们,遗憾的是,目前没有浏览器支持这一点,所以我们必须等待。

与其混淆本机原型,我们应该使用不同的模式:

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

如果我们在应用程序中打开它100次,即使我们忘记调用close方法,也容易被遗忘。然而,只要忘记关闭一次,就会对应用程序产生毁灭性的影响。另一方面,我们可以使用某些承诺库内置的处理器模式:

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
}

-4

Promise对象支持'always'。

例如:

var oPromise = jQuery.ajax({ url: YOUR_URL }).always(function(){ YOUR_CLEAN_UP_METHOD(); })


@SanketPipariya 这不是问题,而是答案。 - zavg
那些点踩的人没有告诉你,但他们是因为你在这里使用了jQuery而对你进行点踩 - 这与讨论原生Promise的问题无关。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接