Пожалуйста, простите, пожалуйста, конкретный вопрос, хотя я думаю, что общая цель цели может быть полезной для других людей.В узле, как я могу запросить JSON из нескольких URL-адресов, используя обещания?
Цель: заполнить MongoDB данными, запрошенными с нескольких URL-адресов API JSON.
Короткий вопрос: До сих пор я имел некоторый успех с request-promise, который использует Bluebird:
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));
Как я хочу писать в БД с успешными запросами, и игнорировать те, которые не могут быть отвечать прямо тогда, мне нужно что-то, что пропускает отвергнут обещания, которые .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 mix Обещания с async.js не рекомендуется –