同时访问两个远程资源并将其输出到合并的响应中 – NodeJS

简而言之。

我需要访问两个或两个以上的远程资源提要,将其合并,并将其显示为来自我的nodejs服务的一个结果。


详细

我需要从多个提供者获取提要(根据仪表板对象中存储的内容可能会有所不同)

连接它们,做一些其他的数据操作,并在最后显示内容为一个数组。

var allFeeds = []; dashboard.providers.forEach(function(provider) { if (provider.source === 'facebook') { ... fb.getFeeds(provider.data.id, function(feeds) { ... Array.prototype.push.apply(allFeeds, feeds); }); } else if (provider.source === 'google') { ... google.getFeeds(provider.data.id, function(feeds) { ... Array.prototype.push.apply(allFeeds, feeds); }); } else if (provider.source === 'twitter') { ... twitter.getFeeds(provider.data.id, function(feeds) { ... Array.prototype.push.apply(allFeeds, feeds); }); } }); ... // other data manipulations ... res.json(allFeeds); 

由于nodejs正在进行asynchronousnetworking调用,我该如何实现呢?

你可以使用asynchronous 。

 var async = require('async'); var allFeeds = []; var tasks = []; dashboard.providers.forEach(function (provider) { if (provider.source === 'facebook') { ... tasks.push(function (done) { fb.getFeeds(provider.data.id, function (feeds) { ... Array.prototype.push.apply(allFeeds, feeds); done(); }); }); } else if (provider.source === 'google') { ... tasks.push(function (done) { google.getFeeds(provider.data.id, function (feeds) { ... Array.prototype.push.apply(allFeeds, feeds); done(); }); }); } else if (provider.source === 'twitter') { ... tasks.push(function (done) { twitter.getFeeds(provider.data.id, function (feeds) { ... Array.prototype.push.apply(allFeeds, feeds); done(); }); }); } }); async.parallel(tasks, function () { ... // other data manupulations ... res.json(allFeeds); }); 

你也可以看看我写的这个post来构build你的代码,以更好地pipe理asynchronous操作

你可以实现承诺,我会告诉你与bluebird.js

 var Promise = require('bluebird'); var fbFeedAsync = Promise.promisify(fb.getFeeds); var googleFeedAsync = Promise.promisify(google.getFeeds); var twitterFeedAsync = Promise.promisify(twitter.getFeeds); function getFeedFor(type, id) { if (type === 'twitter') { return twitterFeedAsync(id); } else if (type === 'google') { return googleFeedAsync(id); } else if (type === 'facebook') { return fbFeedAsync(id); } } var feedRequests = dashboard.providers.map(function(provider) { return getFeedFor(provider.source, provider.data.id); }); Promise.all(feedRequests).then(function(allFeeds) { // you can use Promise.settle (depending on your use case) console.log(allFeeds); });