我应该在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所说,在这种情况下,返回声明没有任何区别。 从文档 :
在承诺得到解决(即履行或拒绝)的所有情况下,该决议是永久性的,不能被重置。 尝试呼叫解决,拒绝或通知,如果承诺已经解决将是一个空操作。