美文网首页
ES6--Promise

ES6--Promise

作者: WANG_M | 来源:发表于2018-03-07 20:58 被阅读0次

    学过ES6的同学大概都知道Promise,可想而知Promise在ES6中很重要。

    Promise对象代表了未来将要发生的事件,用来传递异步操作的消息。Promise是一个构造函数,有属于自己私有的all,reject,resolve,rece等方法,也有原型上面的,属于实例对象调用的方法then,catch。

    Promise对象特点

    1.对象的状态不受外界影响。

    Promise对象代表一个异步操作,有三种状态:
    Fulfilled 可以理解为成功的状态
    Rejected 可以理解为失败的状态
    Pending 初始状态,不是成功也不是失败状态,可以理解为 Promise 对象实例创建时候的初始状态
    Promise英文“承诺”的意思,所以说只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

    2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。

    Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。
    只要这两种情况发生,状态就不会再变了。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

    Promise 对象方法resolve, reject和then

    1.resolve 方法可以使 Promise 对象的状态改变成成功,同时传递一个参数用于后续成功后的操作。
    2.reject 方法则是将 Promise 对象的状态改变为失败,同时将错误的信息传递到后续错误处理的操作。

    1. then 方法,这个方法接受两个参数,第一个是处理 resolved 状态的回调,一个是处理 rejected 状态的回调。

    Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。
    在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve否则调用 reject
    下面看一个例子

    var myFirstPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,调用resolve(), 失败时调用reject()
    //这个例子中,我们使用setTimeout()来模拟异步代码
    setTimeout(function(){
         resolve("成功啦啦啦啦123!"); //代码正常执行!
        }, 250);
    });
    myFirstPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve()方法传入的值.
        document.write("Yay! " + successMessage);
        //Yay!成功啦啦啦啦123!
    });
    

    接下来我们看看then的语法

    p.then(onFulfilled, onRejected);
    p.then(function(value) {
    // fulfillment
    }, function(reason) {
    // rejection
    });
    

    onFulfilled,当Promise变成接受状态(fulfillment)时,该参数作为回调函数被调用,该函数有一个参数,即接受的值(the fulfillment value)
    onRejected,当Promise变成拒绝状态(rejection )时,该参数作为回调函数被调用,该函数有一个参数,即拒绝的原因(the rejection reason)

    当然上面的代码只是then()的语法,还是看看例子比较实在

    let p1 = new Promise(function(resolve, reject) {
      resolve("Success!");
      // or
      // reject ("Error!");
    });
    p1.then(function(value) {
       console.log(value);       // Success!
       }, function(reason) {
        console.log(reason);     // Error!
    });
    

    在上面例子中有两个参数resolve和reject,如果成功则返回值,失败则返回原因。
    catch方法
    下面看一个综合的栗子

    function getNumber(){
      var p = new Promise(function(resolve, reject){
      //做一些异步操作
       setTimeout(function(){
       var num = Math.ceil(Math.random()*10); //生成1-10的随机数
        if(num<=5){
              resolve(num);
                }
         else{
              reject('数字太大了');
                }
          }, 2000);
     });
       return p;            
    }
    getNumber()
    .then(function(data){
    console.log('resolved');
    console.log(data);
    })
    .catch(function(reason){
    console.log('rejected');
    console.log(reason);
    });
    

    在这个例子中生成一个随机数,对这个随机数进行判断
    如果小于等于5,打印resolved和这个随机数
    如果大于5,打印rejected和原因

    相关文章

      网友评论

          本文标题:ES6--Promise

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