【问题标题】:JavaScript wait for promiseJavaScript 等待承诺
【发布时间】:2020-10-31 08:49:49
【问题描述】:

我需要fetchAndInstantiate 等待 someVariable 被定义(通过外部进程)。函数getResult 检测何时定义了所述变量。

我有这两个功能:

async function getResult(){
    if(typeof someVariable !== 'undefined'){
        console.log('yup');
        Promise.resolved(someVariable);
    }else{
        console.log('nop');
        setTimeout(getResult, 250);
    }
}

fetchAndInstantiate = async function(a, b, c){
    delete someVariable;
    console.log('called fetchAndInstantiate');
    document.dispatchEvent(new CustomEvent('wasmcall', {detail: { wasm_mod: a, function: b, args: c}}));
    await getResult().then(function(result){return result;});
}

函数fetchAndInstantiate 调用函数getResult,我希望它等到承诺解决。但是当setTimeout 被调用时,getResult 正在返回一个未定义的承诺。

如何让getResult 仅在定义了 someVariable 时才解析?

【问题讨论】:

  • “当setTimeout 被调用时,BUT getResult 正在返回一个未定义的承诺” - 它总是会“返回”undefined,因为你没有返回任何东西(有用) 在getResult
  • @Andreas 关于如何在不返回未定义的getResult 的情况下调用setTimeout 的任何想法?

标签: javascript asynchronous async-await resolve


【解决方案1】:

您必须确保 getResult 按您的预期返回一个承诺。

此外,使用setInterval 将完成您想要的,而无需那些凌乱的代码。

async function getResult(){
    var result = await new Promise(function(resolve) {
    const interval = setInterval(function(){
      if(typeof someVariable !== 'undefined'){
        clearInterval(interval);
        resolve(someVariable);
      }
    }, 250);
  });
  return result;
}

fetchAndInstantiate = async function(a, b, c){
    delete someVariable;
    console.log('called fetchAndInstantiate');
    document.dispatchEvent(new CustomEvent('wasmcall', {detail: { wasm_mod: a, function: b, args: c}}));
    var result = await getResult();
    return result;
}

【讨论】:

    【解决方案2】:

    您可以创建一个异步延迟:

    const delay = milliseconds => new Promise(resolve, setTimeout(resolve, milliseconds));
    

    并在你的异步函数中使用它:

    async function getResultAsync() {
        while (true) {
            if (typeof someVariable !== 'undefined') {
                return someVariable;
            }
            await delay(250);
        }
    }
    

    这将继续等待直到定义 someVariable,每次检查之间有 250 毫秒的延迟,不会阻塞。

    请注意,您必须在异步函数中返回一些内容;这解决了返回的Promise。

    然后在您的fetchAndInstantiate 函数中使用:

    fetchAndInstantiate = async function(a, b, c) {
        delete someVariable;
        console.log('called fetchAndInstantiate');
        document.dispatchEvent(new CustomEvent('wasmcall', {detail: { wasm_mod: a, function: b, args: c}}));
        await getResultAsync();
    }
    

    您无需将await 与then() 混合使用; await 为您取消Promise 分辨率。

    【讨论】:

    • 感谢您的帮助!抱歉,我一定错过了这个通知。我实际上并没有尝试过你的方法,但看起来它会解决它!再次感谢
    猜你喜欢
    • 2018-08-27
    • 2016-11-29
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2019-04-29
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多