Javascript Promise.resolve与newpromise(resolve)
我正在使用bluebird,我看到了两种将同步函数解析为承诺的方法,但我不明白这两种方法之间的区别。看起来stacktrace有点不同,所以它们不仅仅是一个别名,对吧 那么,首选的方式是什么 方式AJavascript Promise.resolve与newpromise(resolve),javascript,promise,bluebird,Javascript,Promise,Bluebird,我正在使用bluebird,我看到了两种将同步函数解析为承诺的方法,但我不明白这两种方法之间的区别。看起来stacktrace有点不同,所以它们不仅仅是一个别名,对吧 那么,首选的方式是什么 方式A function someFunction(someObject) { return new Promise(function(resolve) { someObject.resolved = true; resolve(someObject); }); } 方式B fun
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
方式B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
与评论中的两个答案相反,存在差异 当 基本上与
new Promise(function(r){ r(x); });
有一个微妙之处
承诺返回函数通常应该保证它们不会同步抛出,因为它们可能异步抛出。为了防止意外结果和竞争条件,抛出通常转换为返回的拒绝 记住这一点——创建规范时,promise构造函数是安全的 如果
someObject
未定义怎么办?
- 方式A返回被拒绝的承诺
- 方式B同步投掷
Promise.method
来解决这个问题,这样您就可以继续使用返回值。因此,用Bluebird写这篇文章的正确且最简单的方法实际上是两者都不是——它是:
var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});
方法会将抛出转换为拒绝,并返回解析。这是实现这一点最安全的方法,它通过返回值吸收,然后
ables,因此即使someObject
实际上是一个承诺,它也可以工作
通常,
Promise.resolve
用于将对象和外部承诺(表)强制转换为承诺。这就是它的用例。上述答案或评论中没有提到另一个区别:
如果某个对象
是一个承诺
,新承诺(解决)
将额外花费两个勾号。
比较以下两个代码段:
const p=newpromise(resovle=>setTimeout(resovle));
新承诺(resolve=>resolve(p))。然后(()=>{
控制台日志(“勾选3”);
});
p、 然后(()=>{
控制台日志(“勾选1”);
}).然后(()=>{
控制台日志(“勾选2”);
});代码>Promise.resolve
就是糖。简短的回答-用法没有区别。只有糖。@Pinal什么是“糖”?@Taurus。语法糖是为了使事物更容易阅读或表达而设计的语法。请参阅:““承诺返回函数通常应保证它们不应同步抛出,因为它们可能异步抛出”。您能否详细说明为什么函数应该是同步的或异步的,但不能同时是同步的或异步的?目前我喜欢Promise.resolve(),你会说使用Promise.resolve()
是一种反模式吗?@AshleyCoolman see-一种有时异步运行的方法应该始终这样做以保持一致性。Promise.resolve()吗
创建一个新的Promise
实例,方法与使用new
相同?否则,返回Promise.resolve(yourCode)
会更快,并避免同步抛出。我感觉很糟糕,我使用了“Promise.resolve().then(function(){/*case,它可以抛出一个错误*/})。然后…”以确保错误成为被拒绝的承诺。。。我将进一步研究“Promise.method”@Polopollo或Promise.coroutine
,这更有用。感谢您的澄清。
var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});