关于async调用的问题

发布于 2022-09-13 00:52:36 字数 1728 浏览 14 评论 0

switch (oneExe.ExeInfo.ET) {      
            case "Subjective": {
                Subjective.draw(oneExe, '', this.json_nowTypeset).then((div) => {
                    str_insertHTML += div
                })
                break;
            }
}      

我的draw是async函数,每次当break的时候上面的方法还没有运行,导致str_insertHTML为空,

如果我把draw中的需要awiat的img.onload那个方法单独写出来,之后onload执行完毕后返回值,然后再在draw中使用的话,这样可不可以直接让上述代码变成同步的,如果这么写的话是将onload写在一个async吗,还是说是写成promise

第一次写async,对于异步真的是刚开始学习没多久,求大佬们指教 TvT

补充一下draw的大致代码

    draw: async function (json_exe, parentId) {
        let answer_height = 0

        let answer_div = document.createElement('div');
        answer_div.innerHTML = json_exe.ExeInfo.SubjectiveAnswer;
        //大概高度(p标签的个数*一个p标签30的高)
        answer_height = answer_div.children.length * this.subject_row_height
        
            for (let i = 0; i < answer_div.children.length; i++) {
                //是否存在图片,如果存在则获取图片的高度
                let answer_img = answer_div.children[i].getElementsByTagName("img")
                if (answer_img.length === 1) {
                    await new Promise((resolve) => {
                        let img = new Image()
                        img.src = answer_img[0].src
                        answer_height -= this.subject_row_height
                        img.onload = function () {
                            answer_height += img.height
                            resolve(answer_height)
                        }
                    })
                }
            }
        
        let div = document.createElement('div')
        div.setAttribute('style', `height:${answer_height}px`)
        return div
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

对你再特殊 2022-09-20 00:52:36

异步就是异步,不可能变成同步。async / await 就是个语法糖,并不改变异步的实质。你要是写不明白,不如老老实实地写 Promise。

let p; // `p` is a Promise
await p;
console.log('done');

就等同于:

let p; // `p` is a Promise
p.then(() => {
   console.log('done');
});

Image.onload 是回调,连 Promise 都不是,怎么可能写 async?你只能包一层:

let p = new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = (e) => resolve(e);
    img.onerror = (err) => reject(err);
    img.src = 'balabala';
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文