资讯专栏INFORMATION COLUMN

JS_是时候使用promise了

894974231 / 2885人阅读

摘要:如果对象已经处于状态,调用方法会立即执行回调函数。好多库中实现叫,对象是用来操作对象修改对象状态,而对象本身只提供方法添加回调函数以及其他添加回调函数的方法,不提供操作对象的方法,这样设计使得对象对外不可修改,详细参考实现。

1. 异步编程

JS是单线程执行了,通过event loop实现了非阻塞的I/O。编程中经常用异步回调函数的方式处理I/O的反馈结果(网络请求,用户交互事件)。如分别发送两个请求:

function xhrRequest(url, callback) {
    setTimeout(function(){ // 用setTimeout模拟异步请求
        callback();
    }, 0)
}

xhrRequest("/index", function(){
    console.log("request /index done");
})
xhrRequest("/list", function(){
    console.log("request /list done");
})

但如果想在请求index后再请求list怎么办呢?,可能会这样写:

xhrRequest("/index", function(){
    console.log("request /index done");
    xhrRequest("/list", function(){ // 回调函数里,再次回调
        console.log("request /list done");
    })
})

但是如果有3个或4个异步请求有先后依赖怎么呢?回调函数会一直嵌套回调函数(callback hell),代码看起来乱糟糟的,并且不好维护。事件模式也不能很好处理这些,急需其他能降低异步编程复杂性的方式。

2. promise模式 2.1 promise A+

Promise已经是个标准了,最新的是Promise A+标准。标准中给Promise的定义是:"A promise represents the eventual result of an asynchronous operation"。即Promise表示一个异步操作的最终结果。主要通过Promise对象的then方法和Promise对象进行交互:注册失败,成功回调函数,并且失败回调函数接收一个失败原因(reason)参数,成功回调函数接收一个值(value)参数。Promise A+标准主要是定义then方法的规范。

2.1.1 Promise对象状态

Promise对象有三种状态:Pending(待定),Fullfilled(已完成),Rejected(已拒绝)。
A:Pending的Promise对象可以转成Fullfilled或者Rejected
B:Fullfilled的Promise对象不能转成其他状态,并且必须含有一个值(value),该值不能变。
C:Rejected的Promise对象不能转成其他状态,并且必须含有一个原因对象(reason)表示失败的原因,该值不能变。

2.1.2 then(onFullfilled, onRejected)方法

then方法的规范很多,认真读读标准。但要主要下面几点:
A:每个回调函数只能执行一次。
B:多次调用then方法,可以注册多个回调函数,回调函数的调用顺序取决于调用then方法的顺序。如果Promise对象已经处于fullfilled/ rejected状态,调用then方法会立即执行onfullfilled/onRejected回调函数。
C:then方法必须返回个Promise对象: Promise2 = Promse1.then(onFullfilled, onRejected)。但没规定Promise1和Promise2是否相等,这个要看具体的实现了。

2.1.3 then链

then方法返回一个Promise对象,这样就构成一个then链。前面的Promise对象的状态变化对后面的Promise对象的状态的影响称为Promise解决程序(The Promise Resolution Procedure)。

2.2 Promise标准实现

实现Promise标准的库和框架有很多了,jQuery,Zeptojs,ES6等。好多库中Promise实现叫Deferred,Deferred对象是用来操作Promise对象(修改Promise对象状态),而Promise对象本身只提供then方法添加回调函数(以及其他添加回调函数的方法),不提供操作Promise对象的方法,这样设计使得Promise对象对外不可修改,详细参考ZeptoJS Deferred实现。

2.3 为什么Promise模式重要

Promise是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错。这样更有利理解,维护。将复杂的异步处理轻松地进行模式化。

参考

异步编程

Promise A+标准

promises 很酷,但很多人并没有理解就在用了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93322.html

相关文章

  • Promise学习笔记(三):源码core.js解析(上)

    摘要:源码阅读阶段先理解根本吧想快点理解的话可以直接跳到下个标题这部分根据理解将持续修改空函数用于判断传入构造器的函数是否为空函数如果为空函数构造一个对象并初始化状态为终值回调状态和队列记录内部最后的一次错误空对象标识表示发生了错误暴露模块接口为 源码阅读阶段 先理解Promise根本吧,想快点理解的话可以直接跳到下个标题.这部分根据理解将持续修改. Promise(fn) function...

    wuyangchun 评论0 收藏0
  • 带你玩转小程序开发实践|含直播回顾视频

    摘要:小程序的视图层目前使用作为渲染载体,而逻辑层是由独立的作为运行环境。比如小程序的,通信一次就像是写情书所以,严格来说,小程序是微信定制的混合开发模式。出栈入栈解决小程序接口不支持的问题小程序的所有接口,都是通过传统的回调函数形式来调用的。 作者:张利涛,视频课程《微信小程序教学》、《基于Koa2搭建Node.js实战项目教学》主编,沪江前端架构师本文原创,转载请注明作者及出处 小程...

    fxp 评论0 收藏0
  • JavaScript Promise启示录

    摘要:近几年随着开发模式的逐渐成熟,规范顺势而生,其中就包括提出了规范,完全改变了异步编程的写法,让异步编程变得十分的易于理解。最后,是如此的优雅但也只是解决了回调的深层嵌套的问题,真正简化异步编程的还是,在端,建议考虑。 本篇,简单实现一个promise,主要普及promise的用法。 一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制...

    Juven 评论0 收藏0
  • 以太坊开发实战学习-Web3.js(九)

    摘要:首先我们需要要记住,以太坊是由共享同一份数据的相同拷贝的节点构成的。你可以运行你自己的以太坊节点来作为。在你部署智能合约以后,它将获得一个以太坊上的永久地址。如果你还记得第二课,在以太坊上的地址是。 通过前边的学习,DApp 的 Solidity 合约部分就完成了。现在我们来做一个基本的网页好让你的用户能玩它。 要做到这一点,我们将使用以太坊基金发布的 JavaScript 库 —— ...

    luckyyulin 评论0 收藏0
  • [转载·JS] JavaScript Promise启示录

    摘要:近几年随着开发模式的逐渐成熟,规范顺势而生,其中就包括提出了规范,完全改变了异步编程的写法,让异步编程变得十分的易于理解。最后,是如此的优雅但也只是解决了回调的深层嵌套的问题,真正简化异步编程的还是,在端,建议考虑。 前段时间频频看到Promise这个词,今天发现腾讯AlloyTeam写得这篇很赞,遂转之。 原文链接 本篇,主要普及promise的用法。 一直以来,JavaScrip...

    Lyux 评论0 收藏0

发表评论

0条评论

894974231

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<