美文网首页
promise(es6)

promise(es6)

作者: 乔阳_4718 | 来源:发表于2017-12-07 17:38 被阅读0次

    1 promise含义

    简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作的结果)Promise对象代表一个异步操作;

    1 特点一(对象状态不受外界影响)

    三种状态:pending(进行中)、resolved(已完成)、rejected(已失败)=》只有异步操作结果可以决定是哪一种状态;

    2 特点二(一旦转态改变,就不会再改变)

    状态改变的两种可能: pending=>resolved ;pending=>rejected

    3 优点

    有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数;

    4 缺点

    无法取消Promise,一旦创建它就立即执行无法中途取消;
    如果不设置毁掉函数,promise内部抛出的错误,不会反映到外部;
    当处于pending状态时,无法得知目前进展到哪一个阶段;
    如果某些事件不断地反复发生,一般来说,使用 stream 模式是比部署Promise更好的选择。

    2 基本用法

    promise新建后会立即执行;then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行;
    如果调用resolve函数和reject函数时带有参数,那么它们的参数会传递给回调函数
    resolve参数:可能是正常值,也可能是另一个promise实例;reject参数通常是Error的实例;

    var p1= new Promise(function(resolve,reject){
        setTimeout(()=> reject(new Error('fail')),3000)
    })
    var p2= new Promise(function(resolve,reject){
        setTimeout(()=> resolve(p1),3000)
    })
    p2.then(result=>console.log(result+'1')).catch(error=>console.log(error+'2'))
    //Error: fail2   p2返回的是另一个promise,导致p2自己的状态无效
    

    3 Promise.all()

    方法用于多个Promise实例,包装成一个新的promise实例;
    var p = Promise.all([p1,p2,p3]);(参数可以不是一个数组,但必须有Iterator接口,且返回的成员都是Promise实例,如果参数不是promise实例,将会调用resolve方法转换为promise实例)

    p的状态由p1,p2,p3三者全是resolve状态才成功,否则失败;等参数状态都返回了才会触发P的回调函数;

    4 Promise.race()

    var p = Promise.all([p1,p2,p3]);
    方法用于多个Promise实例包装成一个promise实例;参数中有一个状态发生改变p的状态就发生改变;

    5 promise.resolve()与promise.reject()

    将现有对象转换为promise对象;

    Promise.resolve('foo')
    // 等价于
    new Promise(resolve => resolve('foo'))
    

    参数是promise实例,原封不动返回
    参数时具有then方法的对象,转换后立即执行then方法;
    参数不具有then方法或不是对象,装换后状态为resolved;
    不带参数,直接调用回调函数,立即resolve的promise对象,是本轮时间结束时,而不是下一轮事件开始时

    setTimeout(function () {
      console.log('three');
    }, 0);
    Promise.resolve().then(function () {
      console.log('two');
    });
    console.log('one');
    // one
    // two
    // three
    

    相关文章

      网友评论

          本文标题:promise(es6)

          本文链接:https://www.haomeiwen.com/subject/liljixtx.html