有关Javascript承诺回报的最佳实践

我是新的承诺,我想知道哪个是最好的做法与本地诺言(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!'); } }); } 

哪一个是最好的select,以便返回一个承诺? 有一些最佳实践规则要遵循?

有一些最佳实践规则要遵循?

如果你已经有了诺言,永远不要创造诺言。

但是,你真的尝试你的第二个例子吗? 它不应该工作,因为Promise忽略执行者的(成功的)返回值(参见规范 )。 换句话说,这个承诺永远不会被解决或被拒绝。

相反,你可以写

 function foo(condition) { if(condition){ return Promise.resolve('Promise result!'); } else { return Promise.reject('Promise rejected!'); } } 

这些select哪一个取决于你的用例。 如果您已经知道结果,则只能在此答案中使用该示例。 但是,如果涉及到asynchronous进程,并且结果由该进程决定,则必须使用第一种forms(因为您必须“等待”该进程)。

最近自己承诺了很多麻烦。

你的第一个代码是正确的,第二个build立一个不必要的额外Promise解决scheme。

关于Promise的事情是,当你包含在代码中的库开始返回的时候,它们真的会成熟起来。 所以,如果我今天使用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); 

请注意,你真的从callback中返回你的承诺。 这个包装确保所有调用它的代码都可以使用Promise。 所以,期望你的“库/帮手”代码充满了这种嵌套的callback,很容易转换成承诺。

将来,当请求库作者本身将其更改为承诺时,可以使用

request(url).then(doSomething).catch(errors)

进一步说,如果您打算在未来某个时候使用类似RxJS的东西,则需要添加另一个额外的图层。 但是,一旦你使用的库升级自己的Promise,以后,希望Observables,编写asynchronous代码将变得更容易。