【发布时间】:2017-06-06 13:38:20
【问题描述】:
请原谅这个相当具体的问题,尽管我认为一般的最终目标可能对其他人有用。
目标:使用从多个 JSON API URL 请求的数据填充 MongoDB。
简短的问题:到目前为止,我在使用 Bluebird 的 request-promise 方面取得了一些成功:
var rp = require('request-promise');
var options = {
uri: 'http://www.bbc.co.uk/programmes/b006qsq5.json',
headers: {
'User-Agent': 'Request-Promise'
},
json: true
};
rp(options)
.then(function (body) {
// Mongoose allows us query db for existing PID and upsert
var query = {pid: body.programme.pid},
update = {
name: body.programme.title,
pid: body.programme.pid,
desc: body.programme.short_synopsis
},
options = { upsert: true, new: true };
// Find the document
Programme.findOneAndUpdate(query, update, options, function(err, result) {
if (err) return res.send(500, { error: err });
return res.send("succesfully saved");
});
})
.catch(function (err) {
return res.send(err);
})
但是,如果任何承诺被拒绝,我如何循环访问一组 URL,而不会使程序失败? 例如,如果任何 URL 错误,使用 Bluebird 会失败。
const urls = ['http://google.be', 'http://google.uk']
Promise.map(urls, rp)
.map((htmlOnePage, index) => {
return htmlOnePage;
})
.then(console.log)
.catch((e) => console.log('We encountered an error' + e));
因为我想用成功的请求写入数据库,并忽略那些可能没有立即响应的请求,所以我需要一些东西来跳过被拒绝的承诺,而 .all 不会这样做。
长问题:
我整天都在阅读有关承诺的内容,这让我很头疼!但是我找到了一些不错的资源,比如https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html,里面提到了Promise factory的使用。这对我的情况有用吗?我最初认为我应该发出每个请求,处理结果并将其添加到数据库中,然后继续下一个请求;但是看到.all 我想我应该做所有的请求,把结果保存在一个数组中,然后用我的数据库保存函数循环。
我什至应该为此使用 Promise 吗?也许我应该只使用 async.js 之类的东西并按顺序运行我的请求。
非常感谢任何帮助或想法。
【问题讨论】:
-
如果请求不相互依赖,没有理由需要 all() 进行数据库更新
-
我认为您可以将 async.eachSeries 与 promise 一起使用。即使发生错误,循环也不会停止caolan.github.io/async/docs.html#eachOfSeries
-
@AsifSaeed 不建议将 Promise 与 async.js 混合使用
标签: javascript node.js mongodb promise bluebird