У меня проблема с практикой, чтобы познакомиться с Node. Я настроил свое приложение, маршруты, а также установил контроллер.
Я использую внешний API и передаю разные идентификаторы, и (позже) я хочу сравнить ответ с данным значением, переданным API, который я пишу. Поэтому я перебираю массив идентификаторов и передаю их вызову API (через путь в опциях), чтобы собрать все ответы.
Меня смущают старые примеры и документы ... какое-то время я пытался сделать это с Promises, пока не прочитал об асинхронности.
/**
* Controller
*/
const url = 'api.outsidesite.com';
const http = require('http');
productids = [
1, 2, 3, 4, 5, 6, 7, 8, 9
];
const options = {
hostname: url,
path: '/v1/items/${productid}?format=json&apiKey=${apiKey}',
method: 'GET',
timeout: 10000
};
exports.findOne = (request, response) => {
const req = http.request(options, res => {
res.on('data', chunk => {
response.send(chunk);
});
});
req.on('error', e => {
console.error(e);
});
req.end();
};
в моем роутере я звоню findOne так:
app.get('api/products/findone/:value', products.findOne);
Теперь я застрял на повторении и вставке идентификаторов. Я читал об async / await и делал звонки последовательно.
Думал об использовании встроенной библиотеки Request , но я не знаю, действительно ли это необходимо.
Я пытался сделать это на основе этого ответа stackoverflow при повторении обещаний
const fetchProductDetails = productids => {
return productids.reduce(function(promise, product) {
return promise.then(function() {
return findOne.done(function(res) {
console.log(res);
});
});
}, Promise.resolve());
};
fetchProductDetails(productids).then(function() {
console.log('all done');
});
но потом я понял, что ответу было 4 года и, возможно, сейчас есть лучший способ сделать это. Кроме того, вызов findOne не был определен, поэтому я немного запутался в том, как ссылаться на функцию export.findOne с помощью express в смеси. Есть идеи по чистому решению для итерации?
Учитывая использование асинхронной серии или что-то вроде этого:
getAll = () =>
async.reduce(
productids,
0,
function(memo, item, callback) {
// pointless async:
process.nextTick(products.findOne());
},
function(err, result) {
console.log(err);
}
);
но я продолжаю внедрять старые решения и не хочу снова идти по неверному пути, если есть простой способ сделать это. Спасибо!
Ресурсы:
Асинхронные лучшие практики
обратный вызов против обещания против асинхронного ожидания