JavaScript ждать обещания - PullRequest
0 голосов
/ 10 июля 2020

Мне нужно 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, и я хочу, чтобы она подождала, пока обещание решает. НО getResult возвращает неопределенное обещание при вызове setTimeout.

Как сделать так, чтобы getResult разрешалось только тогда, когда определена someVariable?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы должны убедиться, что getResult возвращает обещание, как вы ожидаете.

Кроме того, использование setInterval выполнит sh то, что вы хотите, без этого запутанного кода.

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;
}
0 голосов
/ 10 июля 2020

Вы можете создать асинхронную задержку:

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

И использовать это в своей функции asyn c:

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

Это будет продолжать ждать, пока someVariable не будет определено , с задержкой 250 миллисекунд между каждой проверкой, без блокировки.

Обратите внимание, что вы должны возвращать что-то внутри своей функции asyn c; это разрешает возвращаемое 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...