无需在
new Promise()回调中使用return语句。Promise构造函数不期望回调返回任何类型的返回值。
因此,return
在该回调中使用语句的原因仅是为了控制该函数中的执行流程。
如果您希望回调内部的执行完成而又不执行该回调中的任何其他代码,则可以
return;在此时发出a 。
例如,您可以这样编写代码,而无需
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子句来确保函数中的控制流采用正确的路径,并且
return不需要或不使用它。
分发这样的异步函数时,常见的快捷方式是:
function saveToTheDb(value) { return new Promise(function(resolve, reject) { db.values.insert(value, function(err, user) { if (err) return reject(err); resolve(user); }); }}
这在功能上与先前的代码块没有什么不同,但是它的键入更少且更紧凑。
return前面的语句
reject(err);仅出于控制流的原因,以防止
resolve(user);在发生错误的情况下执行该语句,因为所需的控制流将被调用
reject(err),然后不在回调中执行其他任何 *** 作。
实际上,
return在此特定情况下,实际上甚至不需要最后一个语句中的语句,因为执行诺
resolve()后 *** 作
reject()将不会做任何事情,因为将诺言锁存到首先解析或拒绝发生的任何事件。但是,通常认为执行不必要的代码是较差的做法,因此许多人会认为最好使用控制结构流,例如
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”,它使常规的异步函数(与回调一起使用)成为返回promise的函数。有一些库和函数可以在一个函数调用中为您“分配”一个函数或函数的整个对象(例如,整个API),因此您不必手动执行此 *** 作。例如,我经常使用Bluebird,它提供
Promise.promisify()了一个函数的
Promise.promisifyAll()承诺或将一个对象或原型上的所有方法实现了承诺。这非常有用。例如,您可以通过以下方式获得整个
fs模块的承诺版本:
var Promise = require('bluebird');var fs = Promise.promisifyAll(require('fs'));
然后,您可以使用返回承诺的方法,例如:
fs.readFileAsync("file.txt").then(function(data) { // do something with file.txt data here});
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)