3 回答

TA贡献1785条经验 获得超8个赞
您正在遍历 url 并获取jsonData仅在回调函数内有效的 。因为你不知道什么时候request.get会解决。
所以你基本上在做什么,循环遍历 url,启动 GET 请求。但不等待结果并返回函数。(同样,您需要.push在回调内部。
您可以做的是,制作一个承诺数组并运行它,通过Promise.all它自动返回一个数组。而且,您正在并行运行 GET 请求。
function downloadData(url) {
const promises = [];
for (let i = 0; i < url.length; i++) {
promises.push(
new Promise((resolve, reject) => {
request.get(url[i], function (error, response, body) {
if (!error && response.statusCode == 200) {
const content = body
const jsonArray = JSON.parse(content);
resolve(jsonArray)
}else{
resolve()
}
});
})
);
}
return Promise.all(promises);
}
但是使用基于承诺的 HTTP 库就像axios自然地进行承诺链接或异步等待一样。

TA贡献1815条经验 获得超6个赞
这是因为您在 promise 中使用了回调函数,当您调用 api 时,它不会因为异步而在那里等待,它会更进一步并调用 resolve。
var rp = require('request-promise');
downloadData(url) {
return new Promise(async (resolve, reject) => {
var arrData = [];
let jsonArray;
for (var i = 0; i < url.length; i++) {
try{
let res = await rp.get(url[i]);
if (res.statusCode === 200) {
let content = body
jsonArray = JSON.parse(content);
}
}catch (e) {
reject(e)
}
arrData.push(jsonArray)
}
resolve(arrData)
});
}

TA贡献1796条经验 获得超4个赞
将 async/await 与 request-promise 模块一起使用。例如
const request = require('request-promise');
app.get('/', async (req, res, next) => {
// ...
const result = await downloadData(url);
});
async function downloadData(url) {
const arrData = [];
for (var i = 0; i < url.length; i++) {
try {
let data = await request.get(url[i]);
if (data) {
arrData.push(JSON.parse(data))
}
}
catch (err) {
console.log(err)
}
}
return arrData;
}
添加回答
举报