在具有回调的函数中返回数据

时间:2019-06-14 12:06:43

标签: javascript node.js

我刚开始使用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)
        });
    }

3 个答案:

答案 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;

}