- 异步任务会被交付于浏览器JS引擎之外的其他模块(I/O),处理完成后在任务队列FIFO地插入一个事件,供主线程在call stack运行结束后轮询(event loop).
- 主线程调用事件的方法:回调函数,定时器,Promise对象
- 回调函数的执行顺序只与其对应事件被主线程调用的顺序有关。
js promise阅读
1.3promise编写
function getURL(URL) {
return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', URL, true);
req.onload = function () {
if (req.status === 200) {
resolve(req.responseText);
} else {
reject(new Error(req.statusText));
}
};
req.onerror = function () {
reject(new Error(req.statusText));
};
req.send();
});
}
// 运行示例
var URL = "http://httpbin.org/get";
getURL(URL).then(function onFulfilled(value){
console.log(value);
}).catch(function onRejected(error){
console.error(error);
});
原生JS
function get(URL, callback){
var ajax = new XMLHttpRequest();
ajax.open('get',URL,true);
ajax.onload = function(){
if(ajax.status === 200) callback(ajax.responseText)
else callback(new Error(ajax.statusText))
}
ajax.onerror = function(){
callback(new Error(ajax.statusText));
};
ajax.send();
}
var URL = "http://httpbin.org/get";
get(URL,function(value){
console.log(value)
})
zepto
var URL = "http://httpbin.org/get";
$.ajax({
type:"get",
url:URL,
success:function(data, status, xhr){
console.log(xhr.responseText)
},
error:function(xhr,option,error){
console.log(xhr)
console.log("gg")
}
})
由此可见,回调函数没有统一的规范,随意性太强。同时打断了链式调用。
网友评论