Я решаю практическую задачу, чтобы познакомиться с Node. Я настроил свое приложение, маршруты и контроллер.
Я использую внешний API и передаю разные идентификаторы, и (позже) я хочу сравнить ответ с заданным значением, переданным в API, который я пишу. Итак, я перебираю массив идентификаторов и передаю их вызову API (через путь в параметрах), чтобы собрать все ответы.
Меня постоянно смущают старые примеры и документы... какое-то время я пытался сделать это с помощью промисов, пока не прочитал об асинхронности.
/**
* 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 с выражением в миксе. Любые идеи о чистом решении для итерации? Рассмотрите возможность использования асинхронного ряда или что-то вроде этого:
getAll = () =>
async.reduce(
productids,
0,
function(memo, item, callback) {
// pointless async:
process.nextTick(products.findOne());
},
function(err, result) {
console.log(err);
}
);
но я продолжаю внедрять старые решения и не хочу снова идти по неправильному пути, если есть простой способ сделать это. Спасибо!
Ресурсы: