如何正确构造一个循环以确保后续的promise调用和链式logger.log(res)通过迭代同步运行?(蓝鸟)
db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法(来自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');
}); …Run Code Online (Sandbox Code Playgroud) 在这个答案中,一个承诺链是递归建立的.
稍微简化,我们有:
function foo() {
function doo() {
// always return a promise
if (/* more to do */) {
return doSomethingAsync().then(doo);
} else {
return Promise.resolve();
}
}
return doo(); // returns a promise
}
Run Code Online (Sandbox Code Playgroud)
据推测,这会产生一个调用堆栈和一个承诺链 - 即"深"和"宽".
我预计内存峰值会大于执行递归或单独建立一个promise链.
我正在尝试使用promises实现while循环.
这里概述的方法似乎有效. 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;
};
Run Code Online (Sandbox Code Playgroud)
这似乎使用反模式和弃用的方法,如强制转换和延迟.
有谁知道更好或更现代的方法来实现这一目标?
谢谢
我阅读了一些如何重构代码以适应承诺风格的示例,但似乎他们可能需要其他承诺库的帮助。
我的问题是我有多个异步任务,其中一些可能依赖于来自另一个调用的一些信息。所以我的代码看起来像这样:
假设我有一个图书馆桌子。图书馆的桌子上有很多书。一本书有很多页。一个页面有很多照片。
我还使用 LoopBack 为这些表创建实例。
我有一个这种格式的库对象数组。
{
"location": "Hong Kong Island",
"size": "25sq meter",
"availableBooks" : [
{
"bookName": "Harry Potter",
"pages": 235,
"author": "J R Rowling"
"pages": [
{
"page": 1,
"content": "XXX",
"photos": [
{
"urlLink": "https://someLink",
"size": "360X250"
},
{
"urlLink": "https://google",
"size": "650X250"
}
]
}
,
{
"page": 2,
"content": "XXX"
}
]
},
{
"bookName": "Lord Of The Rings",
"pages": 335,
"author": "J. R. R. Tolkien"
}
]
}
Run Code Online (Sandbox Code Playgroud)
对于伪代码,它看起来像这样。
for(something){ …Run Code Online (Sandbox Code Playgroud)