作家
登录

JavaScript异步与Promise实现

作者: 来源: 2017-05-12 10:49:32 阅读 我要评论

你可能还会想问Promises/A是什么,和Promises/A+有什么差别。Promises/A+在Promises/A议案的基本上,更清楚阐述了一些准则,拓展覆盖了一些事实上的行动规范,同时删除了一些不足或者有问题的部分。

Promises/A+规范今朝只存眷若何供给一个可操作的then办法,而关于若何创建,决定promises是日后的工作。

术语

  1. promise: 指一个拥有相符规范的then办法的对象;
  2. thenable: 指一个定义了then办法的对象;
  3. 决定(resolve): 改变一个promise等待状况至已完成或被拒绝状况, 一旦决定,不再可变;
  4. 值(value): 一个随便率性合法的JavaScript值,包含undefined,thenable对象,promise对象;
  5. exception/error: JavaScript引擎抛出的异常/缺点
  6. 拒绝原因(reject reason): 一个promise被拒绝的原因

Promise状况

一个promise只可能处于三种状况之一:

  • 等待(pending):初始状况;
  • 已完成(fulfilled):操作成功完成;
  • 被拒绝(rejected):操作掉败;

then办法

一个promise必须供给一个then办法,以供拜访其当缁ご态,或最终值或拒绝原因。

该办法接收两个参数,如promise.then(onFulfilled,>

  • var promise2 = promise1.then(onFulfilled, onRejected); 
  • // promise2依然是一个promise对象  
  • 决定过程(resolution)

    决定是一个抽象操作过程,该操作接收两个输入:一个promise和一个值,可以记为;[[resolve]](promise, x),如不雅x是一个thenable对象,则测验测验让promise参数应用x的状况值;不然,将应用x值完成传入的promise,决定过程规矩如下:

    1.如不雅promise和x引用自同一对象,则应用一个TypeError原因拒绝此promise;

    2.x为Promise,则promise直接应用x的状况;

    3.x为对象或函数:

    1. 获取一个x.then的引用;
    2. 若获取x.then时抛出异常e,应用该e作为原因拒绝promise;
    3. 不然将该引用赋值给then;
    4. 若then是一个函数,就调用该函数,其感化域为x,并传递两个回调函数参数,第一个是resolvePromise,第二个是rejectPromise:
      1. 若调用了resolvePromise(y),则履行resolve(promise, y);
      2. 若调用了rejectPrtomise(r),则应用原因r拒绝promise;
      3. 若多次调用,只会履行第一次调用流程,后续调用将被忽视;
      4. 若调用then抛出异常e,则:
        1. 若promise已决定,即调用了resolvePromise或rejectPrtomise,则忽视此异常;
        2. 不然,应用原因e拒绝promise;

        5.若then不是函数,则应用x值完成promise;

    4.若x不是对象或函数,则应用x完成promise。

    天然,以上规矩可能存在递归轮回调用的情况,如一个promsie被一个轮回的thenable对象链决定,此时天然是不可的,所以规范建议进行检测,是否存在递归调用,若存在,则以原因TypeError拒绝promise。

    Promise

    在ES6中,JavaScript已支撑Promise,一些主流浏览器也已支撑该Promise功能,如Chrome,先来看一个Promsie应用实例:

    1. var promise = new Promise((resolve, reject) => { 
    2.         setTimeout(function() { 
    3.             resolve('完成'); 
    4.         }, 10); 
    5.     }); 
    6.     promise.then((msg) => { 
    7.         console.log('first messaeg: ' + msg); 
    8.     }) 
    9.     promise.then((msg) => { 
    10.         console.log('second messaeg: ' + msg); 
    11.     });  

    输出如下:

    创建promise语法如下:

    1. new Promise(function(resolve, reject) {}); 
    • 参数

    一个函数,该函数接收两个参数:resolve函数和reject函数;当实例化Promise构造函数时,将急速调用该函数,随后返回一个Promise对象。平日,实例化时,会初始一个异步义务,在异步义务完成或掉败时,调用resolve或reject函数来完成或拒绝返回的Promise对象。别的须要留意的是,若传入的函数履行抛出异常,那么这个promsie将被拒绝。


      推荐阅读

      开源SDN解决方案如何确保网络拓扑无缝切换?

    电信运营商(Telcos)和收集办事供给商(ISP)面对着应用动态拓扑调剂的挑衅,以确保连接的稳定性和持续性。这意味>>>详细阅读


    本文标题:JavaScript异步与Promise实现

    地址:http://www.17bianji.com/lsqh/35174.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)