【问题标题】:Is there any way to use the values(Boolean) of two Callback functions in Node.js?有没有办法在 Node.js 中使用两个回调函数的值(布尔值)?
【发布时间】:2021-12-05 02:50:06
【问题描述】:

这是我的问题:

我需要在 Node.js 中为一个函数编写一个测试,该函数从数据库中选择数据。它通过使用回调函数返回值。(代码在下面。)

getCompanyById(id, callback) {
        let company = null;
        this.db.query("SELECT * FROM Company where id=?", id)
            .on('result', function (data) {
                company = data;
            })
            .on('end', function () {
                callback(company);
            });
 }

我想在 Test 函数中做的是:

  1. 用所有 id(这里是 1 和 2)测试这个函数;
  2. 如果所有测试都通过,console.log("Test for getCompanyById() pass")。

这是我的测试代码的原始版本。

function testGetSchoolAdministrationById() {
  var pass1,pass2;
  databaseConnection.getSchoolAdministrationById(1, function (schoolAdministration) {
      if(schoolAdministration.first_name == "Harald" &&
            schoolAdministration.last_name == "Schmidt" &&
            schoolAdministration.id_schoolAdmin == 1)
         pass1=true;
    }
  );
  databaseConnection.getSchoolAdministrationById(2, function (schoolAdministration) {
      if(schoolAdministration.first_name == "Madeline" &&
            schoolAdministration.last_name == "Müller" &&
            schoolAdministration.id_schoolAdmin == 2)
           pass2=true;
    }
  );
  console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
}

但它返回“未定义”。在网上搜索后,我意识到 Node.js 是 Asynchrony 的,它不会这样工作。 console.log("..") 已经完成,而回调还没有完成。我也看到了答案,比如使用另一个回调函数来处理值。但就我而言,我有 2 个回调,但不知道该怎么做。

所以这是我的问题:

  1. 有没有什么方法可以在不改变getCompanyById(id, callback)函数的情况下实现函数testGetSchoolAdministrationById()的目标?(因为这对其他代码有相当大的影响。)

  2. 如果1.问题是不可能的,有什么办法可以达到目的,而函数getCompanyById(id, callback)可以改吗?换句话说,有没有更好的方法可以在不使用回调的情况下实现getCompanyById(id, callback) 的相同目标?

  3. 或者也许测试框架会对此有所帮助?我没有使用任何测试框架,因为我没有尝试过,而且我对那些不是很熟悉。

这是我第一个关于 Node.js 的项目,所以我对上面提到的任何概念都不是很有信心。因此,欢迎任何建议和答案。由于这也是我关于堆栈溢出的第一个问题,因此也欢迎任何关于问题/标题/结构的建议。希望,我清楚地描述了这一点。我真的很想弄清楚这一点。

【问题讨论】:

  • 嵌套回调,以便在第一个查询完成时执行第二个查询。
  • ...一旦你了解了它是如何与回调一起工作的,请了解 Promise 并改用它们。

标签: javascript node.js testing callback


【解决方案1】:

您的意思是在测试完成后记录字符串?

你必须使用嵌套回调来按照你想要的顺序。

所以在 db 中的第一个 id 检查完成后,在第一个 id 回调中继续进行下一个 id 检查。


function testGetSchoolAdministrationById() {
  var pass1,pass2;
  databaseConnection.getSchoolAdministrationById(1, function (schoolAdministration) {
     
      if(schoolAdministration.first_name == "Harald" &&
            schoolAdministration.last_name == "Schmidt" &&
            schoolAdministration.id_schoolAdmin == 1){

            pass1=true;
            databaseConnection.getSchoolAdministrationById(2, function (schoolAdministration) {
            if(schoolAdministration.first_name == "Madeline" &&
                schoolAdministration.last_name == "Müller" &&
                schoolAdministration.id_schoolAdmin == 2){
               pass2=true;
            
               console.log("Test for getCompanyById() passed: " + (pass1 && pass2));      
               
              }
             else {
               console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
             }
            }
          );
       }
       else {
          console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
       }
    }
  );
  
}

【讨论】:

  • 您不会将它们嵌套在 if 语句中。如果两个条件都不满足,它仍然应该记录日志(值为false)。
  • 为什么不呢?因为如果第一个没有通过,那么它已经没有通过
  • 啊,我明白你的意思了,如果条件不满足,更新我的答案以记录
  • 感谢您的回答,这对我很有帮助。这种方式真的更容易理解。正如@Bergi 所说,Promise 是处理这些问题的更好方法吗?得到答案后,我该怎么办?点击“回答您的问题”按钮?再次感谢。
  • @diveincode 你应该accept one of the answers 如果你愿意的话。是的,promise 是一种更好的处理方式。
【解决方案2】:

您可以使用Promises 轻松实现此目的。

一种方法是使用 async/await 关键字。

async function testGetSchoolAdministrationById() {
  try {
    const pass1 = await new Promise((resolve) => {
        databaseConnection.getSchoolAdministrationById(1, function(schoolAdministration) {
          resolve(schoolAdministration.first_name == "Harald" &&
            schoolAdministration.last_name == "Schmidt" &&
            schoolAdministration.id_schoolAdmin == 1);
        });
      }),
      pass2 = await new Promise((resolve) => {
        databaseConnection.getSchoolAdministrationById(2, function(schoolAdministration) {
          resolve(schoolAdministration.first_name == "Madeline" &&
            schoolAdministration.last_name == "Müller" &&
            schoolAdministration.id_schoolAdmin == 2);
        })
      });
    console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
  } catch (e) {
    console.error(e);
  }
}

或使用Promise.all(arrPromises).then(results) 电话

function testGetSchoolAdministrationById() {
  Promise.all([new Promise((resolve) => {
    databaseConnection.getSchoolAdministrationById(1, (schoolAdministration) => {
      resolve(schoolAdministration.first_name == "Harald" &&
        schoolAdministration.last_name == "Schmidt" &&
        schoolAdministration.id_schoolAdmin == 1);
    });
  }), new Promise((resolve) => {
    databaseConnection.getSchoolAdministrationById(2, (schoolAdministration) => {
      resolve(schoolAdministration.first_name == "Madeline" &&
        schoolAdministration.last_name == "Müller" &&
        schoolAdministration.id_schoolAdmin == 2);
    })
  })]).then(([pass1, pass2]) => {
    console.log("Test for getCompanyById() passed: " + (pass1 && pass2));
  });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2018-08-11
    • 2013-09-15
    • 2020-11-19
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多