我理解等待、异步和承诺的基本概念。我试了很多,但没能得到预期的结果。出于这个原因,我请求你们的帮助。提前进行Thx检查。
我踢掉了所有不必要的代码行,你可以很快看到我想要做的事情。
app.post('/create', (req,res) => {
var dataArray = []
req.body.array.forEach((ele) => {
let blobAdress = ele.link.split('/')[0];
let extracted = ele.extracted
let blob = `${blobAdress}/extracted-${extracted}.json`;
const container = 'test';
//SHOULD BE EXECUTED FOR EACH ELEMENT OF FOR LOOP
api.getTextFromBlob(container, blob, (response, error) => {
if (error){console.log("Error",error)}
let jsonResponse = JSON.parse(response);
console.log(jsonResponse)
dataArray.push(jsonResponse) // I WANT ALL DATA FROM THE CB IN ONE ARRAY BUNDLED
})
})
// RUN THIS PART AFTER FOR LOOP HAS BEEN EXECUTED PROPER
console.log(dataArray) // !ASYNC JS --> DATA ARRAY IS EMPTY BECAUSE datArray IS CONSOLE.LOG BEFORE api.getText EXECTUED
}) 发布于 2020-12-22 20:38:05
首先需要将回调函数封装到Promise对象中:
var getTextFromBlobAsPromise = (container, blob) => new Promise((resolve, reject) => {
api.getTextFromBlob(container, blob, (response, error) => {
if (error) {
console.log("Error", error)
return reject(error); // depends on business
}
let jsonResponse = JSON.parse(response);
console.log(jsonResponse)
resolve(jsonResponse);
})
})然后,您可以等待使用Promise.all函数解析所有的promises:
app.post('/create', (req, res) => {
var promises = [];
req.body.array.forEach((ele) => {
let blobAdress = ele.link.split('/')[0];
let extracted = ele.extracted
let blob = `${blobAdress}/extracted-${extracted}.json`;
const container = 'test';
//SHOULD BE EXECUTED FOR EACH ELEMENT OF FOR LOOP
promises.push(getTextFromBlobAsPromise(container, blob)) ;
})
// RUN THIS PART AFTER FOR LOOP HAS BEEN EXECUTED PROPER
Promise.all(promises).then(dataArray => {
console.log(dataArray) // !ASYNC JS --> DATA ARRAY IS EMPTY BECAUSE datArray IS CONSOLE.LOG BEFORE api.getText EXECTUED
})
})https://stackoverflow.com/questions/65408735
复制相似问题