2017-01-07 91 views
3

有一个全局变量window.listNodes这是一个数组。这个变量每3秒刷新一次并按顺序填充。JavaScript:暂停一个函数并等待一个全局变量

另一个功能onOpen()由用户触发,需要全局变量window.listNodes包含3个元素,而不是更少。 我想要做的事情是:如果全局变量没有.length等于3,那么程序等待代码的另一部分填充window.listNodes,然后再次开始函数onOpen()

socket.onopen = function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      onOpen(); 
     } 
    }); 
}; 

有没有简单的方法来做到这一点?我尝试使用功能setTimeOut()和一个生成器功能和关键字yield,但我失败了。

谢谢您的宝贵帮助:)

+0

_I我尝试了函数'setTimeOut'_我在我的答案中显示了如何使用'setTimeout'完成这项工作。你是怎么做到的? –

回答

3

这可以使用setTimeout和一个自定义的时间间隔等,例如,500毫秒,做到这一点:

function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      setTimeout(onOpen, 500); 
     } 
    }); 
}; 

socket.onopen = onOpen; 
1

随着公司承诺:

function getListNodes() { 
    return new Promise(function check(resolve) { 
    if (window.listNodes.length === 3) { return resolve(window.listNodes); } 
    setTimeout(() => check(resolve), 500); 
    }); 
} 

socket.onopen = async function() { 
    const listNodes = await getListNodes(); 
    // use listNodes normally 
}; 

async函数中,await关键字将暂停该函数,直到它等待的Promise被解析为止(或r弹出)。

getListNodes()返回的Promise将每500毫秒重试一次查找,并在发现长度足够时解决。

请注意,原生地,async函数仅在Chrome和Edge中受支持。你需要Babel + Babel polyfill才能在任何地方使用它们。

相关问题