Promise(异步编程的解决方案)

2019-04-22  本文已影响0人  救救小亮

Promise的含义

Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理,更强大。ES6将其写入了语言标准,统一了用法,原生js提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上说Promise是一个对象,可以通过它获取异步操作的信息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

Promise的优缺点

优点

将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

缺点

1.无法取消,一旦新建就会立即执行,无法中途取消。
2.如果不设置回调函数,在Promise内抛出的错误不会反映到外部,无法得知目前的进度。

写法

Promise对象有三种状态

1.Pending,Promise对象的初始状态
2.Resolved,任务执行完成且成功的状态
3.Rejected,任务执行完成且失败的状态

Promise对象必须实现then方法,then是promise规范的核心,而且then方法也必须返回一个Promise对象,同一个Promise对象可以注册多个then方法,并且回调的执行顺序跟它们的注册顺序一致;
then方法接受两个回调函数,它们分别为:成功时的回调和失败时的回调;并且它们分别在:Promise由Pending状态转换到Resolved状态时被调用和在Promise由Pending状态转换到Rejected状态时被调用。

示例

//用promise封装ajax请求
function ajaxPromise(_url,type){
    return new Promise(function(resolve,reject){
          var xhr = new XMLHttpRequest();
          xhr.open(type,_url);
          xhr.send();
          xhr.addEventListener("readystatechange",function(){  
            if(xhr.readyState != 4){
                return;
            }
            if(xhr.readyState==4&&xhr.status==200){
                var res = JSON.parse(xhr.responseText);
                resolve(res);
            }
            else{
                reject();
            }
          })
    });
}
//调用封装的ajax
ajaxPromise(baseUrl+"recommendPoetry","get").then(function(res){
    console.log(res);
}).catch(function(err){
    console.log("请求失败");
});

特性

立即执行性
var a = new Promise(fuction(resolve,reject){
    console.log(1);
    resolve(2);
});

console.log(3);

a.then((res)=>{
    console.log(res);
})

// 1  3  2
不可逆性
var a = new Promise(fuction(resolve,reject){
    resolve(1);
});
a.then((res)=>{
    console.log(res);    //1
    return res+1;
}).then((res)=>{
    console.log(res);    //2
}).then((res)=>{
    console.log(res);    //undefinde
});
回调异步
var a = new Promise(fuction(resolve,reject){
    resolve(1);
});
console.log(2);
a.then((res)=>{
    console.log(res);
})
// 2  1
上一篇下一篇

猜你喜欢

热点阅读