q 笔记一:异步编程入门

作者: brandonxiang | 来源:发表于2016-05-26 15:31 被阅读267次

    q 笔记一:异步编程入门

    源码github地址在此,记得点星:
    https://github.com/brandonxiang/example-q

    前言

    大家都知道javascript的优点在于异步非阻塞。Javascript异步编程的4种方法指出javascript的单线程的特性和同步(Synchronous)异步(Asynchronous)的执行模式,并且说明了四种异步的方法,如今最重要的当然是Promises对象

    Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口

    异步编程有着一个很大的效率优势,但是异步多了就成为金字塔型的代码结构非常不好阅读,而且异步和同步的控制变得非常非常困难。

    $.getJSON('./api', function(data){
        console.log(data);
        $.getJSON('./api', function(data){
            console.log(data);
        }
    })
    

    这时候,我们需要Promise模式。这种模式其实在ES6已经得到官配,参考Javascript 中的神器——Promise。但是有些人还停留在ES5的开发,没接触node.js这时候,我们需要运用一些第三方库来控制异步的流程。

    Promise在ES5实现

    q的详细说明

    其他几个资源库都应该大同小异,留给你们私下研究。

    串行

    then作为一个关键字,将函数async('first')async('second')async('third')async('fourth')的顺序分开,整体呈现完成第一个函数再完成第二个函数的序列操作。

    async('first').then(function (resp) {
          console.log(resp);
          return async('second');
    }).then(function (resp) {
         console.log(resp);
         return async('third')
    }).then(function (resp) {
         console.log(resp);
         return async('fourth');
    }).then(function (resp) {
         console.log(resp);
    });
    

    并行

    并行要把对应的函数(async('a')async('b')async('c'))事先装备在数组当中。用Q.all()对它们进行并行处理,也就是说这几个函数将同时处理。

    var promises = [];
    promises.push(async('a'));
    promises.push(async('b'));
    promises.push(async('c'));
    Q.all(promises);
    

    串并行混连

    无论是先串后并,还是先并后串都可以。在并行程序Q.all(promises)后,加入then关键字,实现串并行混连,非常适合在拉取数据后对所有数据进行操作。

    Q.all(promises).then(function(){
       console.log('hello world');
    })
    

    总结

    最终,这笔记写的像是物理电路一样,引用q官方文档的一段代码。

    以前异步编程的代码是这样的。

    step1(function (value1) {
        step2(value1, function(value2) {
            step3(value2, function(value3) {
                step4(value3, function(value4) {
                    // Do something with value4
                });
            });
        });
    });
    

    现在异步编程的代码是这样的。

    Q.fcall(promisedStep1)
    .then(promisedStep2)
    .then(promisedStep3)
    .then(promisedStep4)
    .then(function (value4) {
        // Do something with value4
    })
    .catch(function (error) {
        // Handle any error from all above steps
    })
    .done();
    

    转载,请表明出处。总目录前端经验收集器

    相关文章

      网友评论

        本文标题:q 笔记一:异步编程入门

        本文链接:https://www.haomeiwen.com/subject/pdqxdttx.html