承诺在轮询时异步等待

时间:2019-07-26 04:02:52

标签: javascript ecmascript-6 promise async-await

我正在尝试将使用promise(和轮询)的函数转换为异步函数,但我不确定该如何工作。

我有这个:

function myFunction() {
    return new Promise(resolve => {
        // stuff here ...

        var poll = setInterval(function() {
            if (condition) {
                clearInterval(poll);
                resolve("done");
            }
        }, 100);
    });
}

..但我不确定await在这里:

async function myFunction() {
    // stuff here ...

    var poll = setInterval(function() {
        if (condition) {
            clearInterval(poll);
            // await what?
        }
    }, 100);
}

3 个答案:

答案 0 :(得分:1)

setInterval在异步等待中表现不佳。最好使用setTimeout的“承诺版本”,在每次循环迭代时再次调用。

const myFunction = async = () => {
  let condition = false;

  while (!condition) {
    await new Promise(resolve => setTimeout(resolve, 100));
    condition = processCondition();
  }
}

答案 1 :(得分:-1)

您创建的函数并返回一个在间隔后解析的Promise。异步等待也用于简化promise的使用,而不是创建promise的函数。 async-await中不能有myFunction,但是可以在使用myFunction的地方使用它

您的代码看起来像

function myFunction() {
    return new Promise(resolve => {
        // stuff here ...

        var poll = setInterval(function() {
            if (condition) {
                clearInterval(poll);
                resolve("done");
            }
        }, 100);
    });
}

您可以在使用myFunction之类的地方使用async await

async function someFunction() {
     const data = await myFunction();
     console.log(data)
}

答案 2 :(得分:-2)

async function myFunction() {
    // stuff here ...
    var poll = await setInterval(function() {
        if (condition) {
            clearInterval(poll);
            // await what?
        }
    }, 100);
}