我正在使用bluebird在nodejs中链接一些与幻像相关的任务。我的问题是,链中的最后一个获取传递给每个参数的参数作为其结果而不是scrapDomain函数的结果
我现在已经搞乱了2天,请帮忙吗?
承诺链:
Promise
.each(domains, function(domain) {
return ensureDir(domain[0])
})
.each(ssHome)
.each(function(domain){
return scrapDomain(domain).then(function(results){
return results
})
})
.then(function(results){
console.log(results)
})
答案 0 :(得分:1)
请参阅http://bluebirdjs.com/docs/api/promise.each.html
解析为未修改的原始数组,此方法用于副作用。如果迭代器函数返回一个promise或一个thenable,那么等待promise的结果,然后再继续下一次迭代。
答案 1 :(得分:1)
使用专为此设计的mapSeries
:
Promise
.mapSeries(domains, function(domain) {
return ensureDir(domain[0])
})
.mapSeries(ssHome)
.mapSeries(scrapDomain)
.mapSeries(console.log);
虽然,我个人不会这样编写代码。首先,each
和mapSeries
都执行顺序,而其他函数如map
同时执行该函数。
其次,在此用例中,每个步骤都必须等待上一步,这在您的情况下是不必要的。相反,我会这样写:
const scrape = Promise.coroutine(d => { // Promise.coroutine is bluebird specific
let dir = ensureDir(d[0]);
let home = yield ssHome(dir);
let results = yield scrapDomain(home);
return results;
});
然后做:
let results = Promise.map(domains, scrape);
可以让你这样做:
results.then(items => console.log(items));