javascript - 如何使用 Javascript Async-Await 作为轮询 statechange 的替代方法?

标签 javascript promise async-await

我想使用 promises 完成以下任务:仅在某物的状态准备就绪后才进一步执行。 IE。就像轮询外部状态变化。

我尝试过使用 promises 和 async-await,但没有得到想要的结果。我在这里做错了什么,我该如何解决?

MDN docs有类似的东西,但他们的 settimeout 在 promise 中被调用——但这并不是我正在寻找的东西。

我希望 console.log 显示“此功能现在可以使用了!” 5 秒后,执行似乎在调用 await promiseForState() 后停止;

var state = false;

function stateReady (){
 state = true;
}


function promiseForState(){
	var msg = "good to go!";
	var promise = new Promise(function (resolve,reject){
        if (state){
            resolve(msg);
        }
    });
  
  return promise;
}

async function waiting (intro){
 
    var result = await promiseForState();
    console.log(intro + result)
  
}
setTimeout(stateReady,5000);
waiting("This function is now ");

最佳答案

你做错的是 promise 构造函数执行器函数在创建 promise 时立即执行,然后再也不会执行。此时,statefalse,因此什么也没有发生。

Promise(和 async/await)不能替代轮询。您仍然需要在某处进行投票。

好消息:async 函数使使用循环和 promises 的条件代码变得容易。

但是不要将代码放在 promise 构造函数执行器函数中,因为它们的错误处理特性很差。它们是用来包裹 legacy code 的.

相反,试试这个:

var state = false;

function stateReady() {
 state = true;
}

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function promiseForState() {
  while (!state) {
    await wait(1000);
  }
  return "good to go!";
}

async function waiting(intro) {
    var result = await promiseForState();
    console.log(intro + result)
}
setTimeout(stateReady,5000);
waiting("This function is now ");

关于javascript - 如何使用 Javascript Async-Await 作为轮询 statechange 的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411368/

相关文章:

javascript - 设置并获取按钮 id

javascript - 在 highcharts 工具提示中附加第三个 `<td>` 值

c++ - 与 std::future::unwrap 竞争异常传播

kotlin - 如何在Kotlin中返回等待的值?

javascript - 如何将数组的对象元素数量存储在另一个数组中?

javascript - Node js URL解析

javascript - 与 map 函数同步代码

javascript - 将 RSVP.js map idiom 移植到 bluebird

c# - 如何连接异步枚举?

c# - 不等待就取消任务<bool>?