【发布时间】:2016-11-08 01:51:54
【问题描述】:
如何正确地构造一个循环来确保后面的promise call和链式的logger.log(res)通过迭代同步运行? (蓝鸟)
db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise
我尝试了以下方式(方法来自http://blog.victorquinn.com/javascript-promise-while-loop)
var Promise = require('bluebird');
var promiseWhile = function(condition, action) {
var resolver = Promise.defer();
var loop = function() {
if (!condition()) return resolver.resolve();
return Promise.cast(action())
.then(loop)
.catch(resolver.reject);
};
process.nextTick(loop);
return resolver.promise;
});
var count = 0;
promiseWhile(function() {
return count < 10;
}, function() {
return new Promise(function(resolve, reject) {
db.getUser(email)
.then(function(res) {
logger.log(res);
count++;
resolve();
});
});
}).then(function() {
console.log('all done');
});
虽然看起来有效,但我认为它不能保证调用的顺序 logger.log(res);
有什么建议吗?
【问题讨论】:
-
代码对我来说看起来不错(使用
loop函数递归是执行同步循环的方法)。为什么你认为没有保证? -
db.getUser(email) 保证按顺序调用。但是,由于 db.getUser() 本身是一个 Promise,因此按顺序调用它并不一定意味着由于 Promise 的异步特性,对“电子邮件”的数据库查询会按顺序运行。因此,logger.log(res) 的调用取决于哪个查询首先完成。
-
@user2127480:但循环的下一次迭代只有在 promise 解决后才会按顺序调用,这就是
while代码的工作原理?
标签: javascript node.js promise bluebird