q 筆記一:異步編程入門

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();

轉載,請表明出處。總目錄前端經驗收集器

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 英文:Nolan Lawson 譯文:伯樂在線專欄作者 - abell123如有好文章投稿,請點擊 → 這里了解...
    北方蜘蛛閱讀 6,288評論 1 10
  • 異步編程對JavaScript語言太重要。Javascript語言的執行環境是“單線程”的,如果沒有異步編程,根本...
    呼呼哥閱讀 7,333評論 5 22
  • 你不知道JS:異步 第三章:Promises 接上篇3-1 錯誤處理(Error Handling) 在異步編程中...
    purple_force閱讀 1,417評論 0 2
  • 弄懂js異步 講異步之前,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,749評論 0 5
  • 我兒子的催眠曲是 《歌唱祖國》
    貓殿閱讀 197評論 0 0