从快的线上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/

相关文章
相关标签/搜索