【问题标题】:Promise in NodeJS - with loop and multiple callsNodeJS 中的 Promise - 带有循环和多次调用
【发布时间】:2020-09-17 08:12:26
【问题描述】:

下面是我尝试运行的代码。它是示例代码。我面临的问题是,不知何故它不能按我期望的顺序工作。由于它,test1和test2同时进入脚本并搞砸了。

 let testmap = testDataArray.map((testdataContent) => {
      return new Promise((resolve, reject) => {
        console.log(testdataContent)
        logger.info(testdataContent + "to be stored");
        return service1.upload(testdataContent).then((testdataUpload) => {
          logger.info(testdataContent + " is stored ");
          logger.info(testdataContent + " to  be run on script");
          return service2.runScript(testdataContent).then((scriptresponse) => {
            logger.info(testDataName + " successfully run on script");
            resolve(scriptresponse);
          }).catch((err) => {
            reject(err);
          })
        }).catch((err) => {
          reject(err);
        })
      })
    })
    

Promise.all(testmap).then((res) => {
  console.log("Done all");
}).catch((err) => {
  console.log(err);
})

记录器是这样的:

"Test1 to be Stored"
"Test2 to be stored"
"Test1 is stored"
"Test1 to be run on script"
"Test1 successfully run on script"
"Test 2 successfully run on script"
"Done all"

预期订单:

"Test1 to be Stored"
"Test1 is stored"
"Test1 to be run on script"
"Test1 successfully run on script"
"Test2 to be Stored"
"Test2 is stored"
"Test2 to be run on script"
"Test2 successfully run on script"
"Done all"

【问题讨论】:

  • 在 for(let i=0; i

标签: node.js promise


【解决方案1】:

您可以在嵌套在异步函数中的 for 循环中顺序调用它

const run = async (arrOfPromises) => {
  try {
    for (const promise of arrOfPromises) {
      await promise
    }
    console.log('Done')
  } catch (err) {
    console.log(err)
  }
}

run(testmap)

完整代码

let testmap = testDataArray.map(testdataContent => {
  return new Promise((resolve, reject) => {
    console.log(testdataContent)
    logger.info(testdataContent + 'to be stored')
    return service1
      .upload(testdataContent)
      .then(testdataUpload => {
        logger.info(testdataContent + ' is stored ')
        logger.info(testdataContent + ' to  be run on script')
        return service2
          .runScript(testdataContent)
          .then(scriptresponse => {
            logger.info(testDataName + ' successfully run on script')
            resolve(scriptresponse)
          })
          .catch(err => {
            reject(err)
          })
      })
      .catch(err => {
        reject(err)
      })
  })
})

const run = async (arrOfPromises) => {
  try {
    for (const promise of arrOfPromises) {
      await promise
    }
    console.log('Done')
  } catch (err) {
    console.log(err)
  }
}

run(testmap)

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 2019-04-28
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2020-09-17
    相关资源
    最近更新 更多