【问题标题】:Understanding Javascript callbacks了解 Javascript 回调
【发布时间】:2014-12-09 19:09:17
【问题描述】:

我正在阅读各种有关带有回调的 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();
    }

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

非常感谢!

【问题讨论】:

  • 阅读一些关于synchronous Vs Asynchronous的内容
  • 什么是read file?你读得怎么样?如果它是异步的并且需要回调,则必须将回调传递给它(可能包装在匿名函数中)。
  • 什么 javascript 教程建议你声明 int 类型?
  • 对于'int'类型,我只是在编写示例代码(我来自Java背景)。读取文件只是伪代码。我一直在尝试阅读很多内容,但对于新手来说可能会感到困惑。在我花了几天时间试图弄清楚之后,下面的答案对我有所帮助。

标签: javascript asynchronous callback


【解决方案1】:

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

您可以做的是使用您的环境(Node.js、Web 浏览器)提供的一些 API,这些 API 允许您安排异步任务...超时、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?

【讨论】:

  • 谢谢,现在我知道是怎么回事了!
【解决方案2】:
do_func(int num, callback)
{
   readFile(... , callback);
}

我希望你的 readFile 函数也可以接受一个回调,这样你就可以一直传递它,直到文件被读取。

【讨论】:

    【解决方案3】:

    您是正确的,在您的示例中,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";
    

    【讨论】:

    • 谢谢,现在有意义了!
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2014-06-24
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多