JavaScript:暂停函数并等待全局变量

时间:2017-01-07 16:51:34

标签: javascript asynchronous

有一个全局变量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,但我失败了。

感谢您的宝贵帮助:)

2 个答案:

答案 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才能在任何地方使用它们。