Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 第三方非异步函数中的等待函数 异步函数myAsyncFunc():Promise{ //做异步的事情 //例:延期并承诺延期 } libraryObject.onBeforeDrawOnScreen(函数(){ myAsyncFunc();//无法“等待”或阻止。 });_Javascript_Typescript_Async Await - Fatal编程技术网

Javascript 第三方非异步函数中的等待函数 异步函数myAsyncFunc():Promise{ //做异步的事情 //例:延期并承诺延期 } libraryObject.onBeforeDrawOnScreen(函数(){ myAsyncFunc();//无法“等待”或阻止。 });

Javascript 第三方非异步函数中的等待函数 异步函数myAsyncFunc():Promise{ //做异步的事情 //例:延期并承诺延期 } libraryObject.onBeforeDrawOnScreen(函数(){ myAsyncFunc();//无法“等待”或阻止。 });,javascript,typescript,async-await,Javascript,Typescript,Async Await,如何在退出“onBeforeDrawOnScreen”之前等待 库不关心回调的返回类型或值。承诺回报没有空间支票,所以它不会在我的callack上“等待”。 所以我不能在回调中添加“async”字 我知道javascript的事件循环,但是。。。有解决办法吗 谢谢我想看看你是否能找到更好的库,或者——如果你正在使用的库是开源的——试着自己贡献异步支持。否则,真的没有办法做到这一点 您可能会想到执行所谓的忙等待,即有一个while循环,该循环反复检查某些状态,这些状态将由解析承诺更改。但是,由于J

如何在退出“onBeforeDrawOnScreen”之前等待

库不关心回调的返回类型或值。承诺回报没有空间支票,所以它不会在我的callack上“等待”。 所以我不能在回调中添加“async”字

我知道javascript的事件循环,但是。。。有解决办法吗


谢谢

我想看看你是否能找到更好的库,或者——如果你正在使用的库是开源的——试着自己贡献异步支持。否则,真的没有办法做到这一点

您可能会想到执行所谓的忙等待,即有一个while循环,该循环反复检查某些状态,这些状态将由解析承诺更改。但是,由于JS的单线程特性,即使这样也不起作用。负责让您脱离循环的处理程序会被阻塞,直到您脱离循环注意:以下操作将导致无限循环,因此不要实际执行该操作

async function myAsyncFunc() : Promise<void> {
    // do async stuff
    // ex. delay with promise of setTimout
}

libraryObject.onBeforeDrawOnScreen(function(){
    myAsyncFunc(); // can't "await" or block.
});

这就是为什么异步支持在许多JS库中如此重要。

我认为唯一的方法是
libraryObject
“在屏幕上绘制”
事件提供一些取消机制。不,这是不可能的。向库提交一份关于异步的bug报告,或者选择另一个第三方。这是一个坏主意的三个原因都是次要的。你不应该这样做-不能这样做-因为它根本不起作用。这是一个无限循环,没错。设置
done
变量的承诺处理程序永远不会被调用,因为在函数退出之前无法调用它们。我可能应该在发布它之前尝试一下。
libraryObject.onBeforeDrawOnScreen(function(){
    let done = false;
    let error = null;
    myAsyncFunc()
        .then(() => {
            done = true;
        }, (err) => {
            error = err;
            done = true;
        });
    while(!done);
    if (error) throw error;
});