我想使用 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 时立即执行,然后再也不会执行。此时,state
为 false
,因此什么也没有发生。
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/