代码之家  ›  专栏  ›  技术社区  ›  scottdomini

等到承诺成真

  •  -2
  • scottdomini  · 技术社区  · 2 年前

    我用NodeJS设置了一个数据库,希望等到创建了某个表后再开始创建其他表。这种方法 tableExists 解析时状态为true/false,但我希望它只等到它为true。

    const checkTableExists = async () => {
        const exists = await queryInterface.tableExists('Subjects');
        return exists;
    }
    

    我怎样才能强制等到 checkTableExists 返回true?

    2 回复  |  直到 2 年前
        1
  •  0
  •   smac89    2 年前

    使用 setTimeout :

    const CHECK_INTERVAL = 200; // every 200ms
    const checkTableExists = async () => {
       const exists = await queryInterface.tableExists('Subjects');
       if (!exists) {
         return new Promise((resolve, reject) => {
           setTimeout(() => checkTableExists().then(resolve).catch(reject), CHECK_INTERVAL);
         });
       }
       return exists;
    }
    

    解决这类问题的办法不是一直等待。还有其他问题可能会导致无法创建表。您可能需要调整以上代码,以便在检查了设置的次数或超过了一段时间后停止检查。根据数据库运行的环境,使用合理的方法。

        2
  •  0
  •   trincot    2 年前

    添加延迟并重复:

    // Utility function
    const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
    
    const checkTableExists = async () => {
        while (true) {
            const exists = await queryInterface.tableExists('Subjects');
            if (exists) return true;
            await delay(10000); // Wait 10 seconds before trying again.
        }
    }
    

    尽管这解决了承诺 true ,实际上没有必要返回布尔值,因为解析promise作为表现在存在的信号就足够了——true是promise解析时唯一可能的结果。