我刚开始使用Node.js,回调是我已经习惯的东西。有时候,这只会给我带来一段糟糕的时光。 我有一个函数dwnloadData(),它下载数据并将数据附加到一个空数组中并发送该数组。
此处用于下载,我正在使用回调,并且arrData为空 有人可以让我知道更正吗。
要求:arrData,该数组应使用for循环下载所有数据,并应使用promise返回。
downloadData(url) {
return new Promise((resolve, reject) => {
var arrData = [];
for (var i = 0; i < url.length; i++) {
request.get(url[i], function (error, response, body) {
if (!error && response.statusCode == 200) {
var content = body
var jsonArray = JSON.parse(content);
}
});
arrData.push(jsonArray)
}
resolve(arrData)
});
}
答案 0 :(得分:1)
您正在遍历url并获得Public Sub search()
Const REPLACEMENT_TEXT As String = "^&"
Const FIND_TEXT As String = vbNullString
With ActiveDocument.Content
With .Find
.ClearFormatting
.Font.Size = 6
.text = FIND_TEXT
.Replacement.text = REPLACEMENT_TEXT
.Forward = True
.Wrap = wdFindStop
.Format = True
End With
Do While .Find.Execute
'.Select
.MoveStartWhile cset:=Chr$(13) & " ", Count:=wdBackward
.InsertAfter "]"
.InsertBefore "["
.MoveStart unit:=wdCharacter, Count:=.Characters.Count
'.Select
Loop
End With
Beep
End Sub
,该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);
}
但是使用axios
之类的基于承诺的HTTP库自然进行承诺链接或异步等待。
答案 1 :(得分:0)
这是因为您在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)
});
}
答案 2 :(得分:0)
将async / await与请求承诺模块一起使用。例如
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;
}