Javascript 具有回调的函数在函数完成之前执行回调

Javascript 具有回调的函数在函数完成之前执行回调,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我将编写以下代码,用javascript实践回调函数 fs = require('fs'); function funcWithCallback(callback) { fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) { if (err) { return console.log(err); } console.log(data.length); }); callback(); } funcW

我将编写以下代码,用javascript实践回调函数

fs = require('fs');

function funcWithCallback(callback) {

  fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data.length);
  });
  callback();
}

funcWithCallback(function(){
  console.log("string in callback ")
})
代码的目的是试图控制方法执行的顺序。字符串“string in callback”应该在打印文本文件的长度之后打印,但是当我运行此代码时,结果将是:

>> "string in callback"
>> 91389 //the length of YouBikeTP.txt
这不是我期望的结果。 应该是

 >> 91389 //the length of YouBikeTP.txt
 >> "string in callback"

谁能告诉我为什么在funcWithCallback(回调)完成之前调用回调函数?我是否误解了回调函数的含义?

将代码更改为:

原因:您在readFile中定义为回调的函数是异步回调。它不会立即执行,而是在文件加载完成后执行。因此,您需要在异步回调的console.log完成后调用主回调函数

fs = require('fs');

function funcWithCallback(callback) {

   fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) {
      if (err) {
          return console.log(err);
      }
      console.log(data.length);
      callback(); //calling the main callback after the async callback console logs
   });

}

funcWithCallback(function(){
    console.log("string in callback ")
})

将代码更改为:

原因:您在readFile中定义为回调的函数是异步回调。它不会立即执行,而是在文件加载完成后执行。因此,您需要在异步回调的console.log完成后调用主回调函数

fs = require('fs');

function funcWithCallback(callback) {

   fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) {
      if (err) {
          return console.log(err);
      }
      console.log(data.length);
      callback(); //calling the main callback after the async callback console logs
   });

}

funcWithCallback(function(){
    console.log("string in callback ")
})

您没有在
readFile
自己的回调中调用
callback()
,您只是在调用
readFile
之后调用它,然后调用它的回调
函数(err,data)
只有在完成之后。

您没有在
readFile
自己的回调中调用
callback()
,您只是在调用
readFile
之后调用它,然后只有在完成后才调用其回调
函数(err,data)

您必须调用回调()在
fs.readFile
回调函数中。因为回调应该在使用结果或错误编写的asyc函数之后调用。

您必须在
fs.readFile
回调函数中调用回调()。因为回调应该在使用结果或错误编写的asyc函数之后调用。

谢谢您的回复,我还有一个问题,使用上面相同的代码。如果我在callback()的前一行(您命令的那一行)的readFile回调中添加一个IO绑定任务(即将数据保存到另一个文件或耗时的循环操作),callback()会一直执行到I/O绑定任务完成吗?是@張軒銘 无论您试图做什么,如果它是同步的,它都会正常工作,即回调将根据我的回答在该任务之后执行。但是如果您正在执行的任务是异步的,那么您必须将您的主回调放在您试图完成的大任务的回调中。您也可以使用承诺感谢您的回复,我还有一个问题,请使用上面相同的代码。如果我在callback()的前一行(您命令的那一行)的readFile回调中添加一个IO绑定任务(即将数据保存到另一个文件或耗时的循环操作),callback()会一直执行到I/O绑定任务完成吗?是@張軒銘 无论您试图做什么,如果它是同步的,它都会正常工作,即回调将根据我的回答在该任务之后执行。但是如果您正在执行的任务是异步的,那么您必须将您的主回调放在您试图完成的大任务的回调中。你也可以使用承诺