Javascript Promise.all() 在循环内
Javascript Promise.all() inside of a loop
我正在尝试在循环内调用两次网络 API,然后等到网络 API 返回,然后将返回值作为更大数组中的子数组推送。这是我的代码:
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);
});
}
}
promises 中调用的 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 should print after this' 然后是 [[obj, obj], [obj, obj]]。我想我一定对 promise.all 的工作原理有一些根本性的误解,如有任何帮助,我们将不胜感激!
您需要让您的 googlePlace
函数实际上 return 成为一个承诺:
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);
});
});
}
我正在尝试在循环内调用两次网络 API,然后等到网络 API 返回,然后将返回值作为更大数组中的子数组推送。这是我的代码:
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);
});
}
}
promises 中调用的 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 should print after this' 然后是 [[obj, obj], [obj, obj]]。我想我一定对 promise.all 的工作原理有一些根本性的误解,如有任何帮助,我们将不胜感激!
您需要让您的 googlePlace
函数实际上 return 成为一个承诺:
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);
});
});
}