js的异步编程和回调函数之间的关系?

看了好几篇文章,还是没能很彻底的搞明白异步编程

http://segmentfault.com/blog/trigkit4/1190000000670467

如这篇说到第一种"异步模式"编程的方法 回调函数

function f1(callback){

    setTimeout(function () {

      // f1的任务代码

      callback();

    }, 1000);

  }
f1(f2);

我的问题就是:如果没有setTimeout,这个还是回调函数还是异步函数么?
包括后面说的几种方式,都有用setTimeout,是否可以理解为使用了setTimeout的就是异步编程??

阅读 11.2k
7 个回答

异步编程的含义只有一个:

你不能在函数返回时,立即获得你想要执行的结果。

于是,你传入一个callback用以等待任务完成时,把结果告诉你。

setTimeout(xx,1000) 是模拟1秒后你所需要的指令完成任务告诉你结果的形式。

异步和回调没有关系,
同步的也有很多用回调的,
回调只是异步传输结果的一个方式,
只不过是二者同时出现的场合多一点,
并没有依存关系。

我表哥要去我姑妈家帮我 拿回我的剃须刀

他拿回来之前 我不能 刮胡子

他拿回来之前 我可以 洗澡

剃须刀拿回来之后 我就可以刮胡子

洗澡拿回我的剃须刀 是异步的

刮胡子拿回剃须刀的 回调callback

如果是同步的,也就是说代码是这样的:

function f1(callback){
      // f1的任务代码
      callback();
}

代码2 调用f2同步的同步实现
那么调用完f1(f2)之后,f2会被立即执行。
但是你给出的代码是异步的,调用完f1(f2)之后,f2不会被立即执行。
为啥你把异步和回调搞混了呢,我认为是由于一般人不会写我给出的那段同步代码,如果想调用f2,你就直接调用就行了,干嘛还把它封装到f1函数中呢,显得很没必要了,但是这么写你也不能说语法是错的啊。但是如果你使用异步就不一样了,调用完setTimeout之后,如果你不加个回调,我都无法捕获到setTimeout啥时候执行,我要setTimeout函数处理完成之后要做下一步操作,怎么办?只能加一个回调函数了吧。
关于异步的详细介绍还可以参见我的博文:http://blog.whyun.com/posts/js/

js中setTimeout是在所有代码都单步执行完才执行里面的回调函数,可以把settimeout理解成一个事件。

不是。<--先回答问题,然后来瞎掰掰


不要扣概念,写你的代码,解决你的问题

不是说非得先熟读异步编程的4种方法5种模式6个思想什么的才能会异步编程的,那是给“已经会”的人看,让他们“精通”的

先写一个ajax拉数据反馈在页面上

然后写一个ajax同时发2个请求,合并结果反馈在页面上

那就是异步编程

等你写的系统里有10种不同的ajax请求/加载图片请求,有的串行有的并行,有的需要作为校验阻碍另一个动作,有的动作包含几个不同的请求,还有的需要循环发N个请求,你发现原来你的写法崩溃了完成不了功能了,这时候再来找你现在看的这些资料。

看了下这篇文章,里面没有解释事件循环等机制,可以看一下篇文章javascript异步编程

推荐问题
宣传栏