js异步编程解决方案之promiseA+规范

promsieA+是由promiseA演化增强来的,为了解决js异步回调层次过多代码,造成结构混乱难以理解的这个问题的,之前用过when.js 还有Q。Q是用在nodejs端的库,when也可以用在浏览器端,但是要重新build,我是在浏览器端用的,体积有点大啊,就作为尝试而已。

先来看一段代码感受回调之力

var log = console.log.bind(console);
function first (cb) {
    setTimeout(function () {
        if (cb) cb("data 1111");
    },1000)
}
function second (cb) {
    setTimeout(function () {
        if (cb) cb("data 22222");
    },1000)
}
function third (cb) {
    setTimeout(function () {
        if (cb) cb("data 33333");
    },1000)
}
first(function (data) {
    log(data)
    second(function (data) {
        log(data)
        third(function (data) {
            log(data)
        });
    });
});

这个 三层的回调。。。。额。。挺好。。。然后再来感受一下这个

某长达十个的连续回调这个是滴滴某打车的官里的某js文件。。。。。。。我。。。

如果采用 promiseA+ 的方式 就是这样的

function first () {
    var promise = new Promise();
    setTimeout(function () {
        promise.resolve("data 1111");
    },1000);
    return promise;
}
function second () {
    var promise = new Promise();
    setTimeout(function () {
        promise.resolve("data 22222");
    },1000);
    return promise;
}
function third () {
    var promise = new Promise()
    setTimeout(function () {
        promise.resolve("data 33333");
    },1000);
    return promise;
}

first().then(function (data) {
    log(data);
    return second();
}).then(function (data) {
    log(data);
    return third();
}).then(function (data) {
    log(data);
});

就是把原来的三个函数修改了一下,然后就可以看到这个类似链式的调用的,看了是不是很爽。这里出现了一下 Promsie 这个类。 于是乎,这个规范其实就是为这个类做了一下规范。这个规范的原文在这里 promiseA+ ,虽然说是以promiseA为基准的,但是并没有找到相关的文档之类的,一查全都是promiseA+ 的。这个文档的翻译有很多,但是都看的不明不白的,于是就自己去看原文翻译一下。这个翻译还是没有什么压力的。这个规范主要是定义了 then 这个方法及其参数还有各种行为,超级复杂。最后还是有几点看不明白。虽然平时用的时候是挺好用的,但是这个文档看了确实头疼。于是翻译的时候就按照自己理解的东西,把主要的东西翻译出来,并没有与原文对应翻译在这里 

关于如何按照规范实现一个promise,官方有个实现 promiseJS ,它这个就复杂了,完全看不懂,也看不出规范的内容,于是自己就实现了一下,很多坑,learnPromiseAPlus。基本上功能都实现了,还有关于测试的东西也有一些说明。