我在我的代碼中的很多地方都使用了它并且它有效。但在一個地方它沒有給出任何錯誤,也沒有給我想要的結果。當我向支持論壇展示我的代碼時,他們建議“您錯誤地使用了 JS 物件/類“Promise”。”
任何人都可以指導我了解我的代碼有什么問題,這是我的代碼示例:
let charity = {};
await Promise.all(
charity = charityData.map(function( data ) {
let address = data.zipCode
let url = "https://maps.googleapis.com/maps/api/geocode/json?&address=" `'${address}'` "&key=***Google geocoding Key***"; //client's Key
let urlResponse = Backendless.Request.get(url)
// let latitude = urlResponse.results[0].geometry.location.lat;
// let longitude = urlResponse.results[0].geometry.location.lng;
//let updateCharitiesData = {'objectId': data.objectId, 'latitude':latitude, 'longitude':longitude};
return urlResponse;
})
);
return charity;
uj5u.com熱心網友回復:
幾乎。假設 Backendless.Request.[method] 回傳一個承諾,按照以下方式做一些事情會更正確:
async function getCharityData() {
const charity = await Promise.all(charityData.map( async function(data) {
const address = data.zipCode;
const url =
`https://maps.googleapis.com/maps/api/geocode/json?&address=${address}&key=***Google geocoding Key***`; //client's Key
const urlResponse = await Backendless.Request.get(url);
return urlResponse;
}));
return charity
}
Promise.all 需要一個陣列作為引數才能正常作業;在這里傳遞一個 Array.map 并將回傳的值分配給慈善機構,都可以確保您的 Promise.all 按預期運行,并且回傳的陣列是已解決的承諾陣列。
uj5u.com熱心網友回復:
我會這樣做:
function getCharityData() {
// `charity` is an array of Promises that will each resolve to
// a response.
const charity = charityData.map((data) => {
let address = data.zipCode;
let url = 'https://maps.googleapis.com/maps/api/geocode'
let urlResponse = Backendless.Request.get(url);
return urlResponse;
});
return Promise.all(charity);
}
try {
const charityData = await getCharityData();
} catch (e) {
console.error(e);
}
這樣,charityData將是一組獲取的回應。
在您的代碼中,在回傳之前Promise.all()永遠不會分配結果charity,這就是您想要的值。
uj5u.com熱心網友回復:
如果您有權訪問 Async/Await,我只需執行以下操作:
function getCharityData(charityData) {
let results = [];
for (let i = 0; i < charityData.length; i ) {
let url = `https://maps.googleapis.com/maps/api/geocode/json?&address=${charityData[i].zipCode}&key=***Google geocoding Key***`;
try {
let result = await Backendless.Request.get(url);
results.push(result);
} catch (err) {
console.log("Oh dear!");
}
}
return results;
}
對于您的用例,當您有 Async/Await、老式的 for 回圈和 await(我個人更喜歡按順序執行這種呼叫而不是像 Promise.all 那樣并行執行時,不需要使用任何 Promise 庫)我正在查詢外部 API。這也確保我們不會像 Promise.all 那樣快速失敗。)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371485.html
