理解Javascript回调

时间:2014-12-09 19:09:17

标签: javascript asynchronous callback

我正在阅读有关回调的javascript的各种教程,但它们并没有说明一个基本原则。我理解的是,当使用回调调用函数时,这使得可以等待执行某些代码,然后执行回调函数。所以

// function definition
do_func(int num, callback)
{
   Console.log(num);
   ..
   ..
   callback();
}

//call the function
do_func(123, function(){
   Console.log("Running callback");
});

因此,在执行do_func期间,执行所有代码行,然后执行callback()。但是,如果我们的功能改为

    // function definition
    do_func(int num, callback)
    {
       read file...
       ..
       ..
       callback();
    }

然后在读取文件时调用回调。所以我们的目的被打败了。这里发生了什么?

非常感谢!

3 个答案:

答案 0 :(得分:2)

JavaScript本身是同步和单线程的。你不能写一个异步函数。

您可以使用环境提供的一些API(Node.js,Web浏览器),它们允许您安排异步任务...超时,ajax,FileAPI等等。

使用setTimeout的示例(由HTML Timing API提供):

window.setTimeout(function() {
    console.log("World");
}, 1000);
console.log("Hello");

What is a simple example of an asynchronous javascript function?

答案 1 :(得分:0)

do_func(int num, callback)
{
   readFile(... , callback);
}

我希望你的readFile函数也可以进行回调,所以你可以直接传递它,直到文件被读取为止。

答案 2 :(得分:0)

你是正确的,在你的例子中,将立即调用callback()而不等待文件加载。在JavaScript中,只要遇到异步,您通常可以监听事件以了解何时运行回调函数。

加载图片的示例:

var img = new Image();
img.addEventListener('load', callback); //add your listener first because if you ran the next line first it might load before your listener is setup
img.src = "fileondisk.jpg";