我正在练习练习问题以熟悉Node。我设置了我的应用程序,路由,并且还有一个控制器。
我使用外部API并传入不同的ID,并且(稍后)我想比较传递给我正在编写的api的给定值的响应。所以我迭代了一组id并将它们传递给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);
现在我一直在迭代并插入id。我一直在阅读async / await并进行系列调用。
考虑使用内置的Request库,但我不知道它是否真的有必要。
我尝试根据此stackoverflow answer on iterating over promises
进行此操作
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的调用是未定义的,所以我对如何在mix中引用带有express的export.findOne函数感到有些困惑。关于迭代的干净解决方案的任何想法? 考虑使用async series或类似的东西:
getAll = () =>
async.reduce(
productids,
0,
function(memo, item, callback) {
// pointless async:
process.nextTick(products.findOne());
},
function(err, result) {
console.log(err);
}
);
但是我一直在实施旧解决方案,如果有一种简单的方法,我不想再次走错路。谢谢!
资源:
答案 0 :(得分:0)
从节点8.4开始,我强烈建议使用本机async / await。 不再需要库,干净的代码易于调试和跟踪堆栈跟踪。没有更多的蓝鸟,但你仍然可以使用promisses同步功能,如fs和rimraf等......