为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2021-06-29 00:43:59
我刚刚开始使用 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 回答

?
慕的地10843

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自然地进行承诺链接或异步等待一样。


查看完整回答
反对 回复 2021-07-01
?
红糖糍粑

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)

    });

}


查看完整回答
反对 回复 2021-07-01
?
慕的地8271018

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;


}


查看完整回答
反对 回复 2021-07-01
  • 3 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信