猿问

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

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

        });

    }


翻过高山走不出你
浏览 148回答 3
3回答

慕的地10843

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

红糖糍粑

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

慕的地8271018

将 async/await 与 request-promise 模块一起使用。例如const request = require('request-promise');app.get('/', async (req, res, next) => {&nbsp;&nbsp;// ...&nbsp;const result = await downloadData(url);&nbsp;});async function downloadData(url) {&nbsp; const arrData = [];&nbsp; for (var i = 0; i < url.length; i++) {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; let data = await request.get(url[i]);&nbsp; &nbsp; &nbsp; if (data) {&nbsp; &nbsp; &nbsp; &nbsp; arrData.push(JSON.parse(data))&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; catch (err) {&nbsp; &nbsp; &nbsp; console.log(err)&nbsp; &nbsp; }&nbsp; }&nbsp;return arrData;}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答