Promise1

  • 异步任务会被交付于浏览器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")
    }
})

由此可见,回调函数没有统一的规范,随意性太强。同时打断了链式调用。

推荐阅读更多精彩内容