Node.js:for循环后执行

时间:2018-11-28 21:09:10

标签: javascript node.js loops asynchronous intervals

我正在构建一些Node.js应用,并具有如下功能:

update tablename
set Symbology_BBL = case 
                    when last_edited_date between GETUTCDATE() -7  and GETUTCDATE()
                    then 'Week 1'
                    when last_edited_date between GETUTCDATE() - 14 and GETUTCDATE() - 8
                    then 'Week 2'
                    else 'Greater Than Week 3'
                    end

我只希望该函数严格执行(将变量更改为false,执行循环,然后将变量更改为true)

我发现这并不像看起来那样容易,所以我寻求您的帮助。

有没有办法做到这一点?预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Promise确保超时首先解决,然后在所有承诺解决后记录下一个条件。

let allowUA = false;
let arr = [1, 2, 3]

function ex() {
  allowUA = false;
  console.log('false');

  // iterate over the array and create a promise for each iteration
  let promises = arr.map(function(value, index) {
    return new Promise(function(resolve) {
      setTimeout(() => {
        console.log(index);
        // resolve the promise
        resolve();
      }, index * 500);
    });
  })

  // run this when all the promises resolve themselves
  Promise.all(promises).then(function() {
    allowUA = true;
    console.log('true');
  });
}

ex()

答案 1 :(得分:0)

这是一个async/await方法,该方法放弃了for / loop,转而使用setTimeout调用了一个函数,该函数具有一个缓慢缩短的数组:

async function ex(arr) {
  allowUA = false;
  console.log(allowUA);

  function logger(arr) {
    return new Promise((resolve, reject) => {
      (function loop(arr) {
        const [head, ...rest] = arr;
        if (!arr.length) {
          resolve();
        } else {
          console.log(head);
          setTimeout(() => loop(rest), head * 1000);
        }
      }(arr));
    });
  };
  
  await logger(arr);

  allowUA = true;
  console.log(allowUA);
}

const arr = [1, 2, 3, 4];
ex(arr);