javascript - Angular如何调用异步函数并在结果返回后继续
问题描述
我有以下代码:
private dispaly(file){
let srcEncoded = this.resizeImg(file);
}
private resizeImg(file){
if(file && file.type && file.type.includes("image")){
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (e) => {
const imgElement = document.createElement("img");
imgElement.src = e.target.result as string;
imgElement.onload = (e) =>{
const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
const ctx = canvas.getContext("2d");
ctx.drawImage(e.target as HTMLImageElement, 0, 0, canvas.width, canvas.height);
const srcEncoded = ctx.canvas.toDataURL("image/jpeg");
return srcEncoded;
}
}
}
}
一旦值返回,我希望将其分配给document.getElementById("card-img").setAttribute('src', srcEncoded);
尝试使用pipe
,then
但它不起作用。请帮助正确的呼叫方式this.resizeImg(file).???
干杯
解决方案
您可以将回调包装在一个承诺中并实现这一点。我已将您的两个回调函数包装在 Promise 中。
private async resizeImg(file) {
if (file && file.type && file.type.includes("image")) {
var reader = new FileReader();
reader.readAsDataURL(file);
const e = await new Promise((resolve, reject) => {
reader.onload = (e) => {
resolve(e);
}
});
const imgElement = document.createElement("img");
imgElement.src = e.target.result as string;
const imgE = await new Promise((resolve, reject) => {
imgElement.onload = (e) => {
resolve(e);
}
});
const canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
const ctx = canvas.getContext("2d");
ctx.drawImage(imgE.target as HTMLImageElement, 0, 0, canvas.width, canvas.height);
const srcEncoded = ctx.canvas.toDataURL("image/jpeg");
return srcEncoded;
}
}
推荐阅读
- apache-kafka - 如果消息在消息队列中而 kafka 实例被退回,会发生什么情况?
- openssl - 使用 openssl 生成对称主密钥和子密钥
- python - 如何在 Python 中使用模块变量作为内部类变量的参考?
- python - CSV 文件:将列的位置更改为行并重新组织数据集
- python - 我将两个相同的句子与 RIBES NLTK 进行比较并得到一个错误。为什么?
- javascript - 如何使图片标题背景透明
- react-native - 如何告诉 AppCenter 使用特定的 .env 文件 React Native
- python-3.x - 如何在索引联合上将一个 Pandas 数据框与另一个数据框合并,指定对来自有重叠的数据框的数据的偏好?
- mysql-cli - 如何在 macOS 终端中为 mysql 退出“->”?
- python - FactoryBoy 正在访问普通数据库而不是 TEST 数据库