setInterval()中的async forEach()

时间:2017-02-20 13:33:46

标签: javascript node.js es6-promise

我想每分钟轮询一个源列表,并从在线的源列表中从源中提取数组,检查是否存在有效元素并随机选择两个元素并对它们执行异步操作。我的代码看起来像。

const sources = ['source1', 'source2', 'source3']

setInterval(function() {
  sources.forEach((source) => {
    asyncResolveToArrayIfOnline(source)
      .then((list) => {
        if (list) {
          return Promise.all(list.map((element) => {
            return asyncCheckElement(element).then((trueOrFalse) => {
              return [trueOrFalse, element]
            })
          }))
        }
      })
      .then((arrayOfResults) => {
        if (arrayOfResults) {
          let validElementsArray = []
          arrayOfResults.forEach((validElement) => {
            if (validElement[0]) {
              validElementsArray.push(validElement[1])
            }
          })
          if (validElementsArray.length >= 2) {
            drawTwoElements()
            asyncAction(firstDrawnElement, secondDrawnElement)
          }
        }
      })
      .catch(function(err) {
        console.log(err)
      })
  })
}, 60000)

大部分时间都有效。该错误似乎来自这样的事实:asyncResolveToArrayIfOnline(source)有时source2解析而source1尚未处理完成并且已解析的列表被传递给错误的循环。

0 个答案:

没有答案