【问题标题】:Javascript Promise.all() inside of a loop循环内的 Javascript Promise.all()
【发布时间】:2020-11-10 18:06:56
【问题描述】:

我正在尝试在循环内进行两次 Web API 调用,然后等到 webAPI 返回后再将返回的值作为子数组推送到更大的数组中。这是我的代码:

var latlngPairs = [];
function extractLatLongPairs(jsonobj){
    for(var i = 0; i<10; i++){
        let promises = [googlePlace(jsonobj[i]['From LID']), googlePlace(jsonobj[i]['To LID'])];

        Promise.all(promises).then((results) => {
            var temp2 = [results[0], results[1]];
            latlngPairs.push(temp2);
            console.log(latlngPairs);
        });
    }
}

在 Promise 中调用的 googlePlace 函数:

function googlePlace(airport){
    https.get('https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=' + airport + '&inputtype=textquery&fields=geometry', (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
            data += chunk;
        });

        //All data is returned
        resp.on('end', () => {
            data = JSON.parse(data);
            let obj = {
                name: airport,
                location: data.candidates[0].geometry.location
            };
            console.log('latlong should print after this');
            return Promise.resolve(obj);
            });

        }).on("error", (err) => {
            console.log("Error: " + err.message);

    });
}

我希望 console.log('latlong should print after this') 在打印 latlngPairs 之前打印出来。因为顺序相反,所以 latlngPairs 填充有未定义值的子数组。输出类似于:

[
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ],
  [ undefined, undefined ]
]
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this
latlong should print after this

要清楚,我想要实现的顺序是'latlong 应该在此之后打印'然后'[[obj,obj],[obj,obj]]。我想我一定对 promise.all 的工作原理有一些基本的误解,任何帮助都将不胜感激!

【问题讨论】:

    标签: javascript node.js promise google-places-api promise.all


    【解决方案1】:

    你需要让你的googlePlace 函数真正返回一个promise:

    function googlePlace(airport) {
        // notice the new Promise here
        return new Promise((resolve, reject) => {
            https
                .get(
                    "https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=" +
                        airport +
                        "&inputtype=textquery&fields=geometry",
                    (resp) => {
                        let data = "";
    
                        // A chunk of data has been recieved.
                        resp.on("data", (chunk) => {
                            data += chunk;
                        });
    
                        //All data is returned
                        resp.on("end", () => {
                            data = JSON.parse(data);
                            let obj = {
                                name: airport,
                                location: data.candidates[0].geometry.location,
                            };
                            console.log("latlong should print after this");
                            // notice the resolve here
                            resolve(obj);
                        });
                    }
                )
                .on("error", (err) => {
                    console.log("Error: " + err.message);
                    reject(err.message);
                });
        });
    }
    

    【讨论】:

    • 这完全解决了我的问题!你美丽,美丽的人!非常感谢!
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2019-05-16
    • 2018-04-15
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多