Обещание в NodeJS — с циклом и несколькими вызовами

#node.js #promise

#node.js #обещание

Вопрос:

ниже приведен код, который я пытаюсь запустить. это пример кода. Проблема, с которой я сталкиваюсь, в том, что почему-то это работает не в том порядке, который я ожидаю. Из-за этого 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"
  

Комментарии:

1. разрешить обещание индивидуально внутри for(пусть i=0; i

Ответ №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)