![](https://img.haomeiwen.com/i6076715/66b93bf45e982d57.jpg)
promise的含义
promise是异步编程的一种解决方案,比传统的解决方案(回调函数/事件)更合理更强大。
所谓promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。
Promise对象有以下两个特点。
①对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pedding(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
②一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pedding变为fulfilled和从pedding变为rejected。只要这两种情况发生,状体就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果,这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
基本用法
ES6规定,Promise对象是一个构造函数,用来生成Promise实例。
const promise = new Promise(function(resolve,reject) {
if(/* 异步操作成功*/){
resolve(value);
}else{
reject(error);
}
})
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由javascript引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从pedding变为resolved,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;rejected函数的作用是,将Promise对象的状态从pedding变为rejected,在异步操作失败时调用,并将异步操纵报出的错误,作为参数传递出去。
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value) {
//success
},function(error) {
//fail
})
then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象状态变为rejected时调用。其中,第二个函数时可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。
下面是一个Promise对象的简单例子。
function timeout(ms) {
return new Promise((resolve,reject) => {
setTimeout(resolve,ms,'done');
})
}
timeout(100).then(value) => {
console.log(value);
}
then方法返回的是一个Promise实例,表示一段时间以后才会产生的结果。过了指定的时间以后,Promise实例的状态变为resolved,就会触发then方法绑定的回调函数。
这是一个异步加载图片的例子
function loadImageAsync(url) {
return new Promise((resolve,reject) => {
const image = new Image();
image.onload = function() {
resolve(image);
}
image.onerror = function() {
reject(new error('失败'));
}
})
}
上面代码中,使用Promise包装了一个异步加载图片的例子。如果加载成功,就调用resolve方法,如果加载失败,就调用reject方法。
这是一个用Promise对象实现的AJAX操作的例子
const getJSON = function(url) {
const promise = new Promise(function(resolve,reject) => {
const client = new XMLHttpRequest();
client.open("GET",url);
client.onreadystatechange = handle;
client.responseType = "json";
client.setRequestHeader("Accept","Application/json");
client.send();
})
return Promise;
}
getJSON("/posts.json").then(function(json) {
console.log("Contents:" + json);
},function() {
console.log("出错了",error);
});
上面代码中,getJSON是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个Promise对象。需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。
如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;
网友评论