我是新来的承诺,我想知道哪个是本机Promise(NodeJs)的最佳实践。
我在下面放了一些代码来更好地理解这个问题:
CODE_A
function foo(condition) {
return new Promise((resolve, reject) => {
if(condition){
resolve('Promise result!');
} else {
reject('Promise rejected!');
}
});
}
CODE_B
function foo(condition) {
return new Promise(() => {
if(condition){
return Promise.resolve('Promise result!');
} else {
return Promise.reject('Promise rejected!');
}
});
}
返回Promise的最佳选择是什么?有一些最佳实践规则要遵循吗?
答案 0 :(得分:3)
有一些最佳实践规则要遵循吗?
如果您已经拥有承诺,请不要创建承诺。
但是,你真的尝试过你的第二个例子吗?它不应该工作,因为Promise
忽略执行者的(成功)返回值(参见spec)。换句话说,承诺永远不会被解决或拒绝。
相反,你可以写
function foo(condition) {
if(condition){
return Promise.resolve('Promise result!');
} else {
return Promise.reject('Promise rejected!');
}
}
选择哪一项取决于您的使用案例。如果您已经知道结果,则只能使用此答案中的示例。但是,如果涉及异步流程并且结果由该流程确定,则必须使用第一个表单(因为您必须"等待"用于该流程)。
答案 1 :(得分:2)
最近我和Promises一起遇到了很多麻烦。
你的第一个代码是正确的,第二个构建了一个不必要的额外Promise解决方案。
关于Promises的事情是,当您在代码中包含的库开始返回它们时,它们真的会成熟。所以,如果我今天使用NPM的'request'库,我将不得不编写如下代码:
function myRequestPromise(url){
return new Promise((resolve,reject)=>{
request(url,(err,res,body)=>{
if(err) reject(err);
else resolve(body);
})
})
}
然后你去
myRequestPromise(url).then(doSomething).catch(errors);
请注意,您实际上是从回调中返回您的承诺。这个包装器确保调用它的所有代码都可以使用Promises。所以,期望你的'library / helper'代码充满了这些嵌套的回调,这些回调被肮脏地转换成了Promises。
将来,当请求库作者将其本机更改为promises时,您可以使用
request(url).then(doSomething).catch(errors)
进一步说,如果你计划将来某个时候使用类似RxJS的东西,你需要添加另一个额外的层。但是一旦你使用的库将自己升级到Promises,后来希望升级到Observables,编写异步代码将变得更加容易。