請原諒這個相當具體的問題,但我認爲一般的最終目標可能對其他人有用。在Node中,如何使用promise從多個URL請求JSON?
目標:使用從多個JSON API URL請求的數據填充MongoDB。
短的問題:到目前爲止,我已經取得了一些成功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的數組,如果沒有程序失敗如果任何承諾被拒絕? 例如,使用Bluebird的情況下,如果任何URL錯誤都會失敗。
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));
,因爲我想寫信給DB與成功的請求,而忽略那些可能不響應正確的話,我需要的東西,跳過拒絕承諾,這.all
不做。
長問題: 我一直在閱讀關於承諾的一整天,它讓我頭痛!但是我發現了一些很好的資源,例如https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html,其中提到了使用Promise工廠。這是否適合我的情況?我最初認爲我應該提出每個請求,處理結果並將其添加到數據庫,然後轉到下一個請求;但看到.all
我以爲我應該做所有的請求,將結果保存在一個數組中,並通過我的數據庫保存功能循環。
我是否應該使用承諾呢?也許我應該只使用async.js之類的東西,然後連續運行我的請求。
非常感謝您的幫助或意見。
如果請求是不依賴於彼此沒有任何理由,你需要的一切()做數據庫更新 – charlietfl
我認爲你可以使用async.eachSeries與承諾。即使出現錯誤 http://caolan.github.io/async/docs.html#eachOfSeries –
@AsifSaeed與async.js混合承諾不建議 –