js执行顺序+同步异步

JavaScript018

js执行顺序+同步异步,第1张

按照js同步执行的顺序,函数调用会首先执行for循环,循环5次开启了5个延迟器,延时器内部的回调函数将会异步执行,会在延时1s后进入消息队列等待执行。循环了5次,所以此时i的值为5,然后同步执行console.log打印5,第一次同步执行结束,然后开始执行消息队列的异步任务,打印5个5,中间的undefined是函数调用无返回值返回的。

执行顺序和第一题相同,不同的是延时器被包裹在了一个立即执行函数内容,并把每一次循环的i作为参数传入,此时循环内部的函数形成了一个私有作用域,每一次的i变量被独立保存了起来,因此每一次循环的i的值都会被打印出来。

延时器内部回调函数是异步函数,将在延时结束后,进入消息队列等待执行,因此同步的console.log("CCCC")最优先执行,然后延时0ms的延时器的回调先进入消息队列,1000ms后第一个延时器的回调再进入消息队列等待执行,因此先执行0ms的回调打印DDDD,再执行1000ms的回调打印BBBB。

这里与上一题不同的是中间多了一个执行3s的同步while循环,因此执行顺序是这样的:

第一个延时器延时1s后内部异步回调函数进入消息队列等待执行,

等待while循环3s后打印"CCCC",

循环结束后第一个延时器内部的回调已经进入消息队列第一个执行位置等待执行。

第二个延时器延时0s后内部异步回调函数进入消息队列等待执行,延时结束后排到第一个延时器的回调函数后面,

因此异步队里内部先打印"BBBB",再打印"DDDD"

a 函数里如果有异步的代码,则只有两种处理方式:

a函数返回 promise,b函数这样调用: a().then(){b():}

a函数添加一个参数传回调函数,这样调用:a(()=>{b()})

如果a函数不能传入回调函数,又没有返回 promise,则必须要改一下 a函数,可能只是很简单的修改。

我不是很明白楼主的用意!即是异步请求了怎么还能按队列依次加载?所谓一步就是你的程序和当前加载的另外一个程序不在一个队列上,如果你想要按队列依次加载,那么就用同步请求!JQuery ajax已经将这些封装的很好了,你可以直接去使用的!举个例子:

 $.ajax({

     type: "POST",               //请求方式(GET 或 POST)

     async: false,              //同步请求,默认为true即异步请求

     url: "...",                //请求地址

     data: {id : menuId},

     dataType: "html",

     success:function(data){   //请求成功后,调用的回调函数

         alert(data)          //服务器返回给前端的数据

     }

})

如果你对JQuery 不是很懂,下面的这个是JQuery中文API,希望对你有所帮助!链接:

http://www.css88.com/jqapi-1.9/jQuery.ajax/