bluebird承诺每次返回结果

时间:2016-01-24 11:47:39

标签: javascript node.js loops promise bluebird

我正在使用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)
    })

2 个答案:

答案 0 :(得分:1)

请参阅http://bluebirdjs.com/docs/api/promise.each.html

  

解析为未修改的原始数组,此方法用于副作用。如果迭代器函数返回一个promise或一个thenable,那么等待promise的结果,然后再继续下一次迭代。

我认为你想使用http://bluebirdjs.com/docs/api/promise.map.html

答案 1 :(得分:1)

使用专为此设计的mapSeries

Promise
    .mapSeries(domains, function(domain) {
        return ensureDir(domain[0])
    })
    .mapSeries(ssHome)
    .mapSeries(scrapDomain)
    .mapSeries(console.log);

虽然,我个人不会这样编写代码。首先,eachmapSeries都执行顺序,而其他函数如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));