Promise

ES6 promise:  http://es6.ruanyifeng.com/#docs/promise

首先用处:异步编程

老土的做法:异步代码块 回调 ,然后回调函数又是异步,异步里面嵌套回调函数。。。。由于缩进,代码结构上三角形,有人称“毁灭金字塔”,还有人称“ 回调地狱”

ES6 promise对象   4个状态  只有异步操作能改变 promise的状态

  • pending: 还没有得到肯定或者失败结果,进行中
  • fulfilled: 成功的操作
  • rejected: 失败的操作

2个重要方法

then:将事务添加到事务队列中        resolve:开启流程,让整个操作从第一个事务开始执行

通常用法:

p=new Promise(function (resolve,reject) {
       dosome...异步操作
       if("异步操作成功"){
           resolve("回调参数")
       }else{
           reject(error);
       }
   })
    p.then( //接受2个回调函数 ,一个是success 另外一个是error  
            function ('回调参数') {
        
    },function (err) {
       console.log("发生错误"+err)
   })

偷个栗子过来尝尝

var getJSON = function (url) {
        var promise = new Promise(function (resolve, reject) {
            //XMLHttpRequest 异步请求
            var client = new XMLHttpRequest();
            client.open("GET", url);
            client.onreadystatechange = handler;
            client.responseType = "json";
            client.setRequestHeader("Accept", "application/json");
            client.send();

            function handler() {
                if (this.readyState !== 4) {
                    return;
                }
                if (this.status === 200) {
                    resolve(this.response);  //响应成功,通过resolve 改变状态,而且传响应参数给
                                            //.then的成功回调函数
                } else {
                    reject(new Error(this.statusText));  //响应失败,通过reject改变状态 传参数
                }
            };
        });

        return promise;
    };
    getJSON("/posts.json").then(function (json) {    //相当于实例化一个promise对象,封装状态信息
        console.log('Contents: ' + json);        
    }, function (error) {
        console.error('出错了', error);    //失败的回调
    });
var p1 = new Promise(function (resolve, reject) {
  // ...
});

var p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

一个异步操作的结果是返回另一个异步操作

Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。

var p = Promise.all([p1, p2, p3]); Promise.all方法接受一个数组作为参数,p1p2p3都是Promise对象的实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
原文地址:https://www.cnblogs.com/godbutton/p/6170583.html