见下图,这里将jsonp请求设置为同步请求。如果是同步的话,那么正常的结果输出顺序应该是3,4,5,1,2(图中代码标注的顺序),但在结果顺序是1,2,3,4,5。
对两个方法分别在firebug上下断点,结果执行过程中,发现ajax方法的success是最后一个执行的
查了下jquery的文档,关于jQuery.ajax(url,[settings])的用法,文档上说:如果指定了script或者jsonp类型,那么当从服务器接收到数据时,实际上是用了<script>标签而不是XMLHttpRequest对象。这种情况下,$.ajax()不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如beforeSend。
笔者,在这里认为,这里通过jsonp传来的js文件,里面存在有回调方法,所以导致success最后才执行
当把jsonp类型改为json时,恢复到ajax请求时,代码逻辑恢复正常,没有出现“异步”的情况。见下图
补充(来源于网络):
ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。