【问题标题】:Nodejs stopping a loop and waiting fo the answer节点 Js 停止循环并等待答案
【发布时间】:2021-09-17 23:05:27
【问题描述】:

我想在循环中发送数据。循环中的每一轮都必须等待答案。我尝试与 Promise 合作。循环中的第一轮有效,但问题是,循环在承诺后的第一轮停止。很高兴得到一些解释。谢谢!

let dataReceived;

for (let i = 0; i < arr.length; i++){
    dataReceived = false;
    sendInfo(arr[i]);  // send some data
    await checkDataReceived();
    console.log(i);
}

function checkDataReceived() {
    return new Promise((resolve, reject) => {
        if(dataReceived == false) {
        setTimeout(checkDataReceived, 100);
        } else {
        console.log('continue');
        // do something...
        resolve (true);
        }
    });
}

function awaitData(data){
    // do something
    dataReceived = true;
}

【问题讨论】:

    标签: javascript node.js loops promise


    【解决方案1】:

    问题出在 checkDataReceived() 函数中,您仅在 else 块中使用 resolve(true),您还需要在 if 块中使用拒绝或解决,以便从 promise 返回

    function checkDataReceived() {
    return new Promise((resolve, reject) => {
        if(dataReceived == false) {
        setTimeout(checkDataReceived, 100);
          //use either resolve or reject here
        } else {
        console.log('continue');
        // do something...
        resolve (true);
        }
      });
    }
    

    【讨论】:

      【解决方案2】:

      您提供的 sn-p 背后的想法是轮询变量 (dataReceived) 的状态变化,并在成功时采取行动。在适当的模式下,程序应该尝试依赖事件——尤其是在 Node JS 中。

      话虽如此,您面临的问题是重复创建新的 Promise 对象而从未解决它们的结果。

      每次轮询得到错误结果时,checkDataReceived 函数都会创建一个新的 Promise(通过调用自身)。它返回的原始承诺永远不会得到解决。所以,调用await 语句在for 循环中永远不会成功。

      checkDataReceived 函数应该在轮询获得真实结果时尝试解析原始承诺,而不是调用自身。

      function checkDataReceived() {
          return new Promise((resolve, reject) => {
            setInterval() => {if (dataReceived) resolve()}, 100)
          });
      }
      

      【讨论】:

      • 我将 setTimeout() 更改为 setInterval()。现在一切正常。从一开始就是我的错误之一。谢谢!
      • 答案已编辑。是的,它应该是 setTimeout
      猜你喜欢
      • 2020-04-01
      • 2017-05-03
      • 2020-04-17
      • 2021-08-15
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2017-10-01
      • 2019-05-22
      相关资源
      最近更新 更多