Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.resolve与newpromise(resolve)_Javascript_Promise_Bluebird - Fatal编程技术网

Javascript Promise.resolve与newpromise(resolve)

Javascript 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

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

那么,首选的方式是什么

方式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);
}

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

基本上与

new Promise(function(r){ r(x); });
有一个微妙之处


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

记住这一点——创建规范时,promise构造函数是安全的

如果
someObject
未定义怎么办?
  • 方式A返回被拒绝的承诺
  • 方式B同步投掷
Bluebird看到了这一点,Petka添加了
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;
});