從快的線上callback hell代碼提及

概述

就像談到閉包必需要說js變量做用域同樣,談到 promise 以前確定要先說談異步編程。一直以來, javascript 處理異步方式都是使用 callback 方式,對與寫 javascript 的人來時候 callback 深刻人心。好比只有前端經驗沒有後端經驗的同窗看到 java 代碼可能會問『爲何readFile方法能夠直接返回結果?爲什麼不使用 callback 』javascript

因爲 javascript 的單線程性質,必須等待上一個事件執行完成才能處理下一步。傳統解決 javascript 異步編程的方法就是使用 callback,好比這樣:html

$(document).ready(function(){
    ajaxGet('/api/userinfo', function() {
        ajaxGet('/api/productList', function() {
            ajaxGet('/api/ads', function(result) {
                console.log('all done!');
            });
        });
    });
});

再好比這樣:前端

截止到2015年10月20日晚,http://www.kuaidadi.com/assets/js/animate.js還能夠訪問。html5

『快的』用線上代碼爲咱們生動的演示了什麼叫callback hell——『回調地獄』。java

promise

Promise 字面上能夠理解爲『承諾』,即A調用B,B返回一個『承諾』給A,而後A就能夠認爲B給我返回結果的時候我就執行方案一了,反之沒有獲得結果就執行方案二。jquery

上面這句話翻譯爲代碼:git

var resB = B();
var runA = function() {
    resB.then(execPlan1, execPlan2);
}
runA();

Promise 是一種異步操做模式,表示一個異步操做的最終結果,返回的是一個 Promise 對象,因爲是當即返回,因此能夠採用同步操做的流程。 這個 Promise 對象有一個 then 方法,容許指定回調函數,在異步任務完成後調用。es6

好比上面『快的』的例子能夠改寫爲這樣:github

(new Promise(step1))
    .then(step2)
    .then(step3)
    .then(step4)
    .then(step5)
    .then(step6)
    .then(step7)
    .then(step8)
    .then(step9)
    .then(step10)
    .then(step11)
    .then(step12)
    .then(step13)
    .then(step14)
    .then(step15)
    .then(step16)
    .then(step17);

看,『橫向的胖子』變的苗條了,看起來是否是更加可愛呢?ajax

Promise有個一個規範叫作 Promises/A+, 有各類各樣的第三方庫遵循這個規範實現了 Promise/A+ 。 好比 Qwhen, jQuery 有個相似的方法叫 Deferred。

一個 Promise 對象的實例通常有三種狀態:未完成(pending)、已完成(fulfilled)和失敗(rejected)。

這三種的狀態的變化途徑只有兩個,且只能發生一次:從「未完成」到「已完成」,或者從「未完成」到「失敗」。
一旦當前狀態變爲「已完成」或「失敗」,就意味着不會再發生狀態變化了。

Promise對象的運行結果,最終只有兩種。

獲得一個值,狀態變爲fulfilled
拋出一個錯誤,狀態變爲rejected

參考閱讀

JavaScript Promise啓示錄
JavaScript Promise迷你書(中文版)
JavaScript Promises
javascript.ruanyifeng.com
Promise/A+規範

本文首發於 http://fy98.com/2015/10/20/from-callback-hell-to-promise/

相關文章
相關標籤/搜索