【发布时间】:2020-11-28 11:47:59
【问题描述】:
在我的应用程序中,我有一个返回承诺的函数。我在该函数中所做的是,等待 DOM 中的图像可用并提取该元素以生成它的 base64 数据。
getCodesOfOneMerchant(merchantDataEntry: MerchantData) {
var codesOfMerchant = [];
return new Promise(async (resolve, reject) => {
for (let index = 0; index < merchantDataEntry.qrPayloadList.length; index++) {
const value = merchantDataEntry.qrPayloadList[index];
const payLoad = value.qrPayload
this.qrvalue = payLoad;
while (!document.querySelector(".qrcode img")) {
await new Promise(r => setTimeout(r, 500));
console.log("waiting for qr");
}
console.log("QR element is available");
const qrEle = document.getElementById('qrcode');
let imgBase64Data = this.getBase64Image(qrEle.firstChild.firstChild);
console.log('Base64 = ' + imgBase64Data);
var qrName = merchantDataEntry.serviceName + "-" + value.branch + "-" + value.mobile;
let userQr: UserQr = new UserQr();
userQr.name = qrName;
userQr.qr = imgBase64Data;
codesOfMerchant.push(userQr);
console.log('1')
if (index == merchantDataEntry.qrPayloadList.length - 1) {
resolve();
}
}
console.log('2')
console.log('Returning data = ' + JSON.stringify(codesOfMerchant));
return codesOfMerchant;
});
}
下面是调用上面一个的函数。
async downloadQrCodesOfAllSelectedMerchants() {
var qrCodesForAllMerchants = [];
const filteredData = this.merchantDataList.filter(entry => entry.qrSelected);
const promises = filteredData.map(async (value) => {
const qrCodesOfMerchant = await this.getCodesOfOneMerchant(value);
return qrCodesOfMerchant;
});
const qrCodesOfAll = await Promise.all(promises);
console.log('HELLO');
console.log(qrCodesOfAll); // this prints undefined
console.log('DONE')
}
即使我在第一个方法中返回了 Promise,调用函数仍然收到 undefined。我不明白那里出了什么问题。
如您所见,我只是在返回之前记录数据以返回到第二个函数内的控制台。数据就在那里。
有人可以在这里帮助我吗?谢谢你..!
【问题讨论】:
-
您没有向
resolve回调传递任何内容。 (还有 executor 函数中的return不做任何事情。) -
是的,您正在从您的
getCodesOfOneMerchant解析undefined。 -
你能建议我怎么做吗?
-
见
Promise()constructor documentation。它解释得最好。
标签: javascript angular typescript promise async-await