有一个全局变量window.listNodes
是一个数组。此变量每3秒刷新一次并按顺序填充。
另一个函数onOpen()
由用户触发,需要包含3个元素的全局变量window.listNodes
,而不是更少。
我想要做的是:如果全局变量没有.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 :(得分:3)
这可以使用setTimeout
和自定义时间间隔来等待,例如500ms:
function onOpen() {
if (window.listNodes.length === 3) {
// Do something
} else {
// Wait and when window.listNodes.length === 3:
setTimeout(onOpen, 500);
}
});
};
socket.onopen = onOpen;
答案 1 :(得分: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被解析(或拒绝)。
从getListNodes()
返回的Promise将每500毫秒重试一次查找,并在发现长度足够时解析。
请注意,仅在Chrome和Edge中支持async
功能。你需要Babel + Babel polyfill才能在任何地方使用它们。