我应该在Promise中使用return吗?

function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { // remember error first ;) if (err) { return reject(err); // don't forget to return here } resolve(user); }) } } 

这里是我从这里看到的代码。 我很困惑关于return关键字。

为了resolve(user); 我需要return吗?

reject(user); 我需要return吗?

new Promise()callback中不需要使用return语句。 Promise构造函数不期待callback中的任何返回值。

所以,在callback中使用return语句的原因只是为了控制该函数中的执行stream。 如果你想在你的callback中执行完成,而不是在callback中执行更多的代码,你可以发出一个return; 在那时候。

例如,你可以写这样的代码,没有return语句:

 function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { if (err) { reject(err); } else { resolve(user); } }); } } 

在这种情况下,您使用了if / else子句来确保函数中的控制stream程采用正确的path,并且不需要或不使用return


Promiseasynchronousfunction这样一个共同的捷径是:

 function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { if (err) return reject(err); resolve(user); }); } } 

这在function上与之前的代码块不同,但是input更less,结构更紧凑。 reject(err);前面的return语句reject(err); 仅仅是为了防止执行resolve(user);stream量控制原因resolve(user); 语句,因为所需的控制stream程是调用reject(err) ,然后不执行callback中的其他任何事情。


事实上,在这个特定情况下,最后一个块中的return语句实际上甚至不需要,因为在reject()之后执行resolve() reject()将不会执行任何操作,因为promise会locking到先发生的任何一个parsing或拒绝。 但是,执行不必要的代码通常被认为是不好的做法,所以很多人会认为最好使用if/else类的控制结构或return来执行所需的代码。

所以,这在技术上也会起作用,但是不被认为是最佳实践,因为它执行不必要的代码,而且结构不够清晰:

 function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { if (err) reject(err); resolve(user); }); } } 

仅供参考,您在这里所做的就是所谓的“promisifying”,它将一个常规的asynchronous函数与callback函数结合起来,形成一个返回promise的函数。 有一些函数库和函数会在一个函数调用中为你“提供”一个函数或整个对象的函数(例如一个完整的API),所以你不必手动去做。 例如,我经常使用提供Promise.promisify()来提供一个单一的函数的Bluebird,或者Promise.promisifyAll()来提供一个对象或原型的所有方法。 这非常有用。 例如,你可以通过这个获得整个fs模块的promisified版本:

 var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); 

然后,您可以使用返回承诺的方法,例如:

 fs.readFileAsync("file.txt").then(function(data) { // do something with file.txt data here }); 

一般来说,在NodeJS中,你不应该使用promise构造函数。

promise构造函数用于将不会返回promise的API转换为promise 。 你应该考虑使用一个提供promisification的库(即使你全面使用native promise),因为它提供了一个安全的替代scheme,在error handling逻辑中没有微妙的错误。

自动promisification也相当快。

这就是说,你的问题的答案是“是”。

这样做是完全安全的,承诺构造函数没有什么特别之处 – 它们只是普通的JavaScript。 Domenic 在他的博客中讨论了promise构造函数的devise。

这是非常安全的(就像任何其他function)提前返回 – 它实际上是相当普通的常规asynchronous函数。

(另外,在你的示例代码中,你应该只使用Promise.resolve ,但是我认为这很简单,只是因为它是一个例子)。

从重复复制这个答案

正如@JaromandaX所说,在这种情况下,返回声明没有任何区别。 从文档 :

在承诺得到解决(即履行或拒绝)的所有情况下,该决议是永久性的,不能被重置。 尝试呼叫解决,拒绝或通知,如果承诺已经解决将是一个空操作。