Promise是一个对象,用来传递异步操作的消息,代表某个未来才会知道结果的事件[将异步的操作以同步的操作的流
程表达出来],
promise对象有以下特点,
1. 对象的状态不受外界的影响。Promise对象代表一个异步操作,有3中状态,pending,resolved,rejected,
只有异步操作的结果可以决定当前是哪一种状态,任何其他的操作都无法改变这个状态
2. 一旦状态改变就不会再变,任何时候都是这个结果
3. promise无法取消,一旦新建就会立即执行,无法中途取消
4. 不设置回调函数,promise内部的错误不会反应到外部
promise基本用法
Promise构造函数接受一个函数作为参数,函数的两个参数分别是resolve和reject,他们是2个函数
resolve:状态从pending=>resolved
reject:状态从pending=>rejected
实例生成之后,可以用then方法分别指定resolved状态和rejected状态的回调函数
promise.then(function(res){},function(err){}),
// 异步加载图片的例子
function loadImageAsync(url) {
return new Promise((resolve, reject) => {
var img = new Image();
img.onload = function () {
resolve(img);
};
img.onerror = function () {
reject(new Error("qqq"));
};
img.src = url;
});
}
loadImageAsync("./test.png").then((res) => {
console.log(res, "res=============");
});
// Promise 实现ajax
let getJSON = function (url) {
var promise = new Promise(function (resolve, reject) {
var clint = new XMLHttpRequest();
clint.open("GET", url);
clint.onreadystatechange = handler;
clint.responseType = "json";
clint.setRequestHeader("Accept", "application/json");
clint.send();
function handler() {
if (this.readyState != 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error("2"));
}
}
});
};
如果调用resolve和reject函数的时候带有参数,name这些参数会被传递给回调函数,resolve除了可以传递值之外
还可以传递promise
Promise.prototype.then
promise实例具有then方法,也就是说then方法是定义在原型对象promise.prototype上的,作用是为Promise实例
添加状态改时的回调函数,then方法返回的是一个新的promise因此可以采用链式调用
采用链式调用的then可以指定一组按照次序调用的回调函数,前一个回调函数有可能返回的还是一个promise对象(有
异步操作)而后一个回调函数就会等待该promise对象的状态发生变化,再被调用
Promise.prototypr.catch