Node.js - 在promise.all()之后为每个结果继续保证链

时间:2016-11-01 21:47:20

标签: node.js promise es6-promise

我在保证链中使用 jQuery(function() { jQuery('a[href*="#"]:not([href="#"])').click(function() { if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { var target = jQuery(this.hash); target = target.length ? target : jQuery('[name=' + this.hash.slice(1) +']'); if (target.length) { jQuery('html, body').animate({ scrollTop: target.offset().top - jQuery('#masthead'). outerHeight() }, 1000); return false; } } }); }); 。 Promise.all()中的每个promise都返回一个字符串。

我遇到的问题是Promise.all()returns a Promise反对下一个承诺,我想继续为每个字符串建立承诺链。

以下是一个例子:

Promise.all()

.... return Promise.all(plugins); }) .then(function(response) { console.log(response) .... 看起来像:

response

有没有办法为每个结果继续保证链,而不是继续使用包含所有结果的单个对象?

3 个答案:

答案 0 :(得分:1)

Promise.all期待一系列承诺。所以插件是一系列的承诺,而且更多:插件是一个承诺。 所以你可以链接你的插件Promise。 这将成为 Promise.all(plugins.map(function(plugin){ return plugin.then(function(yourPluginString){ return 'example '+ yourPluginString; }) }))

答案 1 :(得分:0)

Promise.all(),通过其设计返回一个单一的promise,其解析值是您传递的所有promise的已解析值数组。这就是它的作用。如果那不是你想要的,那么也许你使用的是错误的工具。您可以通过多种方式处理单个结果:

首先,您可以循环遍历返回结果的数组,并随意执行任何操作以进行进一步处理。

Promise.all(plugins).then(function(results) {
    return results.map(function(item) {
        // can return either a value or another promise here
        return ....
    });
}).then(function(processedResults) {
    // process final results array here
})

其次,您可以在将.then()传递给Promise.all()之前为每个承诺附加一个// return new array of promises that has done further processing // before passing to Promise.all() var array = plugins.map(function(p) { return p.then(function(result) { // do further processing on the individual result here // return something (could even be another promise) return xxx; }); }) Promise.all(array).then(function(results) { // process final results array here }); 处理程序。

Promise.all()

或者,第三,如果您在完成所有结果时并不真正关心并且您只是想单独处理每个结果,那么根本不要使用.then()。只需将parent::__construct();处理程序附加到每个单独的承诺,并在发生时处理每个结果。

答案 2 :(得分:0)

您可以使用https://github.com/Raising/PromiseChain

之类的工具

并实现你所说的

//sc = internalScope
var sc = {};

new PromiseChain(sc)  
    .continueAll([plugin1,plugin2,plugin3],function(sc,plugin){
       return plugin(); // I asume this return a promise
    },"pluginsResults")  
    .continueAll(sc.pluginsResults,function(sc,pluginResult){ 
       return handlePluginResults(pluginResult);
    },"operationsResults")  
.end();

如果你有任何问题,我没有测试代码