2017-06-20 203 views
1

我会写下面的代码来练习函数与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" 
>> 91389 //the length of YouBikeTP.txt 

这不是我期待的结果。 应该

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

任何人都可以告诉我为什么会回调函数被调用之前funcWithCallback(回调)完成?我误解了回调函数的含义吗?

回答

4

你的代码改成这样:

原因:你已经定义为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 ") 
}) 
+0

谢谢你的回复,我还有一个问题使用上面的同样的代码。 如果我在前一行callback()(您命令的那一行)的readFile回调中添加了一个IO绑定任务(例如,将数据保存到另一个文件或耗时的循环操作),callback()将执行直到I/O限制任务完成? –

+1

yes @张轩铭无论你想要做什么,如果它是同步的,它将正常工作,即回调将在该任务之后按照我的回答执行。但是如果你正在做的任务是异步的,那么你将不得不将主回调放在回调中,以完成你正在努力完成的大任务。你也可以使用promises https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –

1

你是不是叫callback()readFile自己的回调中,您呼叫readFile后只调用它,则只有在完成后调用其回调function (err,data)

1

您必须调用fs.readFile回调函数中的callback()。由于应该在asyc函数写入结果或错误后调用回调函数。