Promise.defer 标准?

问题描述 投票:0回答:2

我正在使用 Promises,并且更喜欢这样使用它:

function Deferred() {
    this.resolve = null;
    this.reject = null;
    this.promise = new Promise(function(resolve, reject) {
        this.resolve = resolve;
        this.reject = reject;
    }.bind(this));
    Object.freeze(this);
}

function somethingAsync() {

    var deferred = new Deferred();

    // do stuff then deferred.resolve();

    return deferred.promise;
}

我刚刚在 Firefox 中遇到了

Promise.defer()
,它给了我同样的东西,这是标准吗?或者只是特定于 Firefox?我什至在 Firefox 的 Promise 文档中都找不到它 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

javascript promise deferred
2个回答
5
投票

Promise.defer
曾经是一个建议,但决定不将其包含在规范中,而是包含使用揭示构造函数模式的承诺构造函数。

它在 Firefox 和 Chrome 中实现,后来从 Chrome 中删除。它不是一个标准,但曾经是一个提案。

在设计时,您对 Promise 构造函数的使用已明确支持作为用例。

委员会决定使用 Promise 构造函数的原因是因为它默认防止同步

throw

new Promise((resolve, reject) => {
    thisThrowsSynchronously();
}); 

如果 Promise 构造函数没有执行此操作 - 您可能必须在每个 Promise 返回函数调用上使用

.catch
} catch(e) {
,这可能会令人沮丧。 Promise 构造函数建立了一个不变量,其中
.catch
就足够了。

我还想指出,除了转换回调 API 之外 - 我可以一方面数出我使用 Promise 构造函数的次数。通常,您的代码应该具有接近零的延迟或 Promise 构造函数的使用。


0
投票

现在是 2024 年,所有主流浏览器都实现了这一点。 功能是

Promise.withResolvers()
- MDN

你的函数看起来像这样:

function somethingAsync() {

    const { promise, resolve, reject } = Promise.withResolvers()

    // do stuff then resolve();

    return promise;
}

请注意,这可能会导致反模式。 JS 社区已经在没有这个的情况下工作了十年。 在开始使用它之前,请确保您熟悉 Promise-Chaining 和

async
/
await
。 (我知道我想使用这个,当我学习如何使用 Promises 时,但后来了解到没有这个我可以取得更好的结果。)

© www.soinside.com 2019 - 2024. All rights reserved.