有没有办法将 finally 添加到现有的承诺中?

Is there a way to add finally to an existing promise?

我正在使用 localforage,它 returns 对 key() 和 length() 等函数的承诺。我也在使用 $http() ,它 returns 也是一个承诺,但它包含一个 finally() 函数,而另一个没有。

我的链下服务不知道是 localforage 还是 $http 发出请求,因此它们都需要相同的 promise 结构(finally 和 then)。有没有办法将 finally 添加到还没有的 promise 中?

我试图将 $q.defer().promise.finally 附加到我在 localforage 的承诺中,但没有成功。

var promise = localforage.length();
promise.finally = $q.defer().promise.finally;
return promise;

还有其他方法可以实现吗?

如果你想 "convert" 一个承诺变成另一个你可以使用他们的 resolve 方法来解析一个内部承诺(或采用承诺的价值)。对于 $q,您可以使用 resolve method here。所以基本上:

return $q.resolve(localforage.length());

还有 Promise.prototype.finally coming up soon, so you can scratch $q and use native Promise with a shim。您所要做的就是字面上使用 Promise 而不是 $q (字面意思)。