ES6学习笔记(四)--------------------------------------promise

首先promise是一个构造器函数,使用它必须通过new一个实例出来,并且new出来的实例晕有一个内置的参数,这个参数是一个函数,这个参数拥有自己内置的两个参数,resolve和reject,并且这两个参数也是两个函数


  var promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }.then(function(){},
function(){})

*上面这个就是一个最简单的promise对象

var a=new Promise(function(resolve,reject){
    console.log("A");
    resolve();
    console.log("B")
}).then(function(){
    console.log("C")
})
//A
//B
//C

var b=new Promise(function(resolve,reject){
    var success="success";
    var err="err";
    reject(err)
}).then(function(e){
    console.log(e)
},function(e){
    console.log(e)
})//err

then属于promise的一个方法,then里面的两个参数属于promise的状态达成后所调用的回调函数,当promise状态为成功时候,调用第一个函数,失败则调用第二个函数,同时我们可以看出,promise实例在创建后的那一刻,它的实参函数就开始执行,当resolve函数执行后,promise对象的状态由进行变为了执行成功,同样,reject函数的执行将promise状态由进行变为失败

另外resolve和reject也起到传递信息的作用,信息通过他们的参数来传递,then方法则可以来接收传递的信息

关于Promise的一些属性方法可以Promise.prototype获取,注意:Promise首字母一定要大写

当然then方法可以采用链式反应,即当then方法的参数(回调函数)执行后又返回一个promise实例,则后面的then会继续等待该实例最终的状态而采取回调

var b = new Promise(function (resolve, reject) {
    var a = function () {
        return new Promise(function (resolve, reject) {
            var c = 1;
            resolve(c)
        })
    };
    reject(a)
}).then(function (e) {
    console.log(e)
}, function (e) {
    var d = e();
    return d
}).then(function (e) {
    console.log(e)
}, function (e) {
    console.log(e)
})//1

Promise的catch方法是当上面的程序发生错误的时候指定所要执行的回调函数,该回调函数有一个参数err,用来储存捕获到的错误

    var a=function(){
        return new Promise(function(resolve,reject){
            resolve(x+3)//x没有声明
        }).catch(function(err){
            console.log(err)
        }).then(function(){console.log("success")},
            function(){
                console.log("err")
            })
    };
    a()//输出 x is not defined
    
    var a=function(){
        return new Promise(function(resolve,reject){
            resolve(x+3)
        }).then(function(){console.log("success")},
            function(){
                console.log("err")
            })
    };
    a()//输出err
  
  var a=function(){
        return new Promise(function(resolve,reject){
            reject(x+3)
        }).then(function(){console.log("success")},
            function(){
                console.log("err")
            })
    };
    a()//输出err  

第一个例子里面当reslove被调用的时候发生错误,catch捕捉错误并执行回调函数,catch后面的then方法则成为对于catch做出的结果进行回调,由于捕获错误成功,则调用then的第一个回调函数
从2号例子中我们对比可以看出在promise状态又进行到成功需要resolve函数执行成功才能判定promise状态成功,resolve函数没有执行成功,则promise状态立刻变为reject失败,并调用then后第二个函数
从3号例子可以看出,promise中的状态执行失败都会调用reject

var a=function(){
        return new Promise(function(resolve,reject){
            console.log(1)
        }).then(function(){console.log("success")},
            function(){
                console.log("err")
            })
    };
    a()  //1

我们从上面例子可以看出没有给promise指定状态时候,then方法是不会被激活

var a=function(){
        return new Promise(function(resolve,reject){
            resolve();reject();
        }).then(function(){console.log("success")},
            function(){
                console.log("err")
            })
    };
    a()//success

上面例子我们可以看出一旦有一个状态被指定就不能在改变。

    原文作者:王炜
    原文地址: https://segmentfault.com/a/1190000011101333
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞