gpt4 book ai didi

javascript - Promise.resolve 与 new Promise(resolve)

转载 作者:IT王子 更新时间:2023-10-29 02:49:21 28 4
gpt4 key购买 nike

我正在使用 bluebird,我看到了两种将同步函数解析为 Promise 的方法,但我不明白这两种方法之间的区别。看起来堆栈跟踪有点不同,所以它们不仅仅是一个别名,对吧?

那么首选的方式是什么?

方式A

function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}

方式B

function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}

最佳答案

与评论中的两个答案相反 - 存在差异。

同时

Promise.resolve(x);

基本相同

new Promise(function(r){ r(x); });

有一个微妙之处。

Promise 返回函数通常应该保证它们不应该同步抛出,因为它们可能会异步抛出。为了防止出现意外结果和竞争条件 - 抛出通常会转换为返回的拒绝。

考虑到这一点——在创建规范时,promise 构造函数是安全的。

如果 someObjectundefined 怎么办?

  • 方法 A 返回被拒绝的 promise 。
  • 方式 B 同步抛出。

Bluebird 看到了这一点,Petka 添加了 Promise.method 来解决这个问题,这样您就可以继续使用返回值。所以在 Bluebird 中编写这个的正确和最简单的方法实际上都不是 - 它是:

var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});

Promise.method 将为您将抛出转换为拒绝并将返回转换为解析。这是执行此操作最安全的方法,它通过返回值吸收 then 能力,因此即使 someObject 实际上本身就是一个 promise,它也能正常工作。

通常,Promise.resolve 用于将对象和外部 promise (thenables)转换为 promise 。这就是它的用例。

关于javascript - Promise.resolve 与 new Promise(resolve),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711243/

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