gpt4 book ai didi

javascript - Promises 有 'finally' 模式吗?

转载 作者:搜寻专家 更新时间:2023-11-01 04:59:48 26 4
gpt4 key购买 nike

想象一下以下基于 Promise 的示例:

function treadLightly() {
return Promise.resolve()
.then(function() { allocateResource(); })
.then(function() { doRiskyOperation(); })
.then(function() { releaseResource(); })
.catch(function() { releaseResource(); })
;
}

无论 doRiskyOperation() 是否解决或拒绝,我们都想调用 releaseResource()。但是在两个不同的地方调用 releaseResource() 时有一点代码味道。

我们真正想要的是与 javascript 的 finally 等价的东西。

在 Promises 中是否有更简洁的编码方式?

最佳答案

ES2015 (ES6) promise 还没有 finally 。有一个 Stage 2 proposal对于它,这意味着它基本上不可能出现在 ES2017 中,但有可能出现在 ES2018 中。我还没有看到一个非常好的模式(与实际的 finally 功能相对)。

一些第三方 promise 库有它,包括Bluebird , Q , 和 when . jQuery 的 Deferred 的 promises 也有,形式为 always .

提案有一个 polyfill你可以使用:

if (typeof Promise !== 'function') {
throw new TypeError('A global Promise is required');
}

if (typeof Promise.prototype.finally !== 'function') {
var speciesConstructor = function (O, defaultConstructor) {
var C = typeof O.constructor === 'undefined' ? defaultConstructor : O.constructor;
var S = C[Symbol.species];
return S == null ? defaultConstructor : S;

var C = O.constructor;
if (typeof C === 'undefined') {
return defaultConstructor;
}
if (!C || (typeof C !== 'object' && typeof C !== 'function')) {
throw new TypeError('O.constructor is not an Object');
}
var S = C[Symbol.species];
if (S == null) {
return defaultConstructor;
}
if (typeof S === 'function' && S.prototype) {
return S;
}
throw new TypeError('no constructor found');
};
var shim = {
finally(onFinally) {
var handler = typeof onFinally === 'function' ? onFinally : () => {};
var C;
var newPromise = Promise.prototype.then.call(
this, // throw if IsPromise(this) is not true
x => new C(resolve => resolve(handler())).then(() => x),
e => new C(resolve => resolve(handler())).then(() => { throw e; })
);
C = speciesConstructor(this, Promise); // throws if SpeciesConstructor throws
return newPromise;
}
};
Promise.prototype.finally = shim.finally;
}

关于javascript - Promises 有 'finally' 模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com