关于Javascript承诺返回的最佳做法

时间:2016-06-15 13:46:43

标签: javascript node.js promise

我是新来的承诺,我想知道哪个是本机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的最佳选择是什么?有一些最佳实践规则要遵循吗?

2 个答案:

答案 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,编写异步代码将变得更加容易。