2017-07-24 75 views
-1

我有如下代碼片段。如何在node.js中的async.parallel中製作循環

async.parallel({ 

    foo: function(call) { 

     request.get('...?node=foo', function (error, response, body) { 

     var last=JSON.parse(body); 
     call(null,last.data.result); 
     }); 

    }, 
    bar: function(call) { 
     request.get('...node=bar', function (error, response, body) { 

     var last=JSON.parse(body); 
     call(null,last.data.result); 
     }); 
    } 
    }, function(err, results) { 
    callback(results) 
    }); 

但我想在循環中......也就是說,就像下面這樣。

var node = ['foo', 'bar']; 
async.parallel({ 

    for (var i = 0; i < node.length; i++) { 
    node[i]: function(call) { 

     request.get('...?node=' + node[i] + '', function(error, response, body) { 

     var last = JSON.parse(body); 
     call(null, last.data.result); 
     }); 

    } 
    } 

}, function(err, results) { 
    callback(results) 
}); 

它不工作...如何使它? 你能幫助我嗎?

+0

['async.map()'](https://caolan.github.io/async/docs.html#map ) –

回答

1

您有兩種選擇之一。一種是閱讀async.map()的文檔,這將是使用async的更規範的方法。

這將是這個樣子:

async.map(['foo', 'bar'], function (node, callback) { 
    request.get('...?node=' + encodeURIComponent(node), function (error, response, body) { 
    if (error) return callback(error) 
    var last = JSON.parse(body) 
    callback(null, last.data.results) 
    }) 
}, function (error, results) { 
    // handle error 
    callback(results) 
}) 

你的第二個選擇是使用Promise.all()與同步Array#map(),消除依賴於async完全,但你可能要像bluebird一個填充工具,直至承諾在更多的瀏覽器中使用。

這裏是你如何使用本地承諾實現後一種解決方案:

Promise.all(['foo', 'bar'].map(function (node) { 
    return new Promise(function (resolve, reject) { 
    request.get('...?node=' + encodeURIComponent(node), function (error, response, body) { 
     if (error) return reject(error) 
     var last = JSON.parse(body) 
     resolve(last.data.result) 
    }) 
    }) 
})).then(function (results) { 
    callback(results) 
}).catch(function (error) { 
    // handle error 
}) 
+0

謝謝@patrick – JoBlox