多个IF条件使用Async/await在nodejs中一一执行

multiple IF conditions execute one by one in nodejs using Async/await

我如何 运行 同步执行此 if 语句。我已经尝试了很多次,但无法解决这个问题。 (我是 nodejs 初学者)。 我想在这里使用 async/await 但它不起作用。 我如何首先检查条件是否完成,然后第二个 if 语句将 运行! 请帮忙。 这是我的虚拟代码:

record1='10';
record2='20';

function main(){

      if(record1){
        console.log('-------------------------');
        console.log('I am record 1')
        val='John',
        firstJob(val)
        
      }

      if(record2){
        console.log('I am record 2')
        val='Rahul',
        firstJob(val)
      }
}

 async function firstJob(val){
 
  console.log('Hello, I am ' + val)
  await secondJob(val);

}

async function secondJob(val){
 
  console.log(val+ ' is a nodeJs beginner!')
  await listFiles()

}

 function thirdJob(arg){
  if (arg='pass'){
     console.log('This is end of the one if condition')
  }
}


 function  listFiles (){ 
      return new Promise((resolve, reject) => {
      setTimeout(() => {
      const path = require('path');
      const fs = require('fs');
      const { exit } = require('process');
      const  directoryPath = path.join(__dirname, '../');
      console.log('List of Avaialble Files :');
      fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
          if (err) {
              return console.log('Unable to scan directory: ' + err);
          } 
          files.forEach(function (file) {
              if (file.isFile()){
                  console.log(file);
              } 
          });
      });
      arg='pass'
      thirdJob();
      
    }, 2000)
  })

}

main();

简短的回答是你不能“同步运行”。 你必须耐心等待他们完成才能得到答案。

因此,如果不进行 main async,您必须以老式的方式使用承诺,并使用 then.

对操作进行排序

record1='10';
record2='20';

function main(){

  Promise.resolve()
    .then(() => {
      if(record1){
        console.log('-------------------------');
        console.log('I am record 1');
        val='John';
        return firstJob(val)
      }
    })
    .then(() => {
      if(record2){
        console.log('I am record 2')
        val='Rahul';
        return firstJob(val)
      }
    });
}

 async function firstJob(val){

  console.log('Hello, I am ' + val)
  await secondJob(val);

}

async function secondJob(val){

  console.log(val+ ' is a nodeJs beginner!')
  await listFiles()

}

main();

我刚刚包含了 if 和 promise 内容的片段。这里的要点是,您有条件地将对 firstJob.

的调用链接在一起

每次调用 then 都允许您(可能不是必需的)将另一个承诺附加到刚刚完成的承诺的执行中。在上面的代码片段中,只有当条件为真时,我们才会这样做,方法是从对 firstJob 的调用中返回承诺。

顺便说一下,您对 listFiles 的实现永远不会完成,因为您永远不会调用 resolve 来实现您在函数内做出的承诺。这通过在循环完成后解决您的承诺来解决问题。

function  listFiles (){ 
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const path = require('path');
      const fs = require('fs');
      const { exit } = require('process');
      const  directoryPath = path.join(__dirname, '../');
      console.log('List of Avaialble Files :');
      fs.readdir(directoryPath, { withFileTypes: true },function (err, files) {
        if (err) {
          console.log('Unable to scan directory: ' + err);
          reject(err);
        } 
        files.forEach(function (file) {
          if (file.isFile()){
            console.log(file);
          } 
        });
        resolve();
      });
      arg='pass'
      thirdJob();
      
    }, 2000)
  })

}

请注意在完成循环后添加的对 resolve 的调用。 在 readdir 返回错误的情况下,我还添加了对 reject 的调用,因为这是使用您的手动承诺传播它的正确方法。

还有一些提示,通常在文件顶部需要模块一次,而不是在函数内部动态调用。这样做的代价还不错,需要的模块有一个缓存。这只是不惯用语。

if (arg='pass'){

不做任何相等性检查,那是一个赋值,你需要 ==,或者 === 如果你想检查是否相等。