ES6 Promise 对象 – 将异步代码像同步代码那些书写
博客阐明
文章所波及的材料来自互联网整顿和集体总结,意在于集体学习和教训汇总,如有什么中央侵权,请分割自己删除,谢谢!
简介
从语法上说,Promise 是一个对象,从它能够获取异步操作的音讯。Promise 提供对立的 API,各种异步操作都能够用同样的办法进行解决。艰深来说,Promise 是一个容器,外面保留着异步操作的后果。
特点
对象的状态不受外界影响
Promise
对象有三种状态:pending
(进行中)、fulfilled
(已胜利)和rejected
(已失败)。
只有异步操作的后果,能够决定以后是哪一种状态,任何其余操作都无奈扭转这个状态。
一旦状态扭转,就不会再变,任何时候都能够失去这个后果
Promise
对象的状态扭转,只有两种可能:从 pending
变为 fulfilled
和从 pending
变为rejected
。只有这两种状况产生,状态就凝固了,不会再变了,并且会始终放弃这个后果,这时就称为 resolved(已定型)。
长处与毛病
长处
1、Promise
对象能够将异步操作以同步操作的流程表达出来,用同步的形式写异步的代码,防止了层层嵌套的回调函数。
2、Promise
对象提供对立的接口,使得管制异步操作更加容易。
毛病
1、无奈勾销Promise
,一旦新建它就会立刻执行,无奈中途勾销。
2、如果不设置回调函数,Promise
外部抛出的谬误,不会反馈到内部。
3、第三,当处于 pending
状态时,无奈得悉目前停顿到哪一个阶段(刚刚开始还是行将实现)。
案例
Promise 实例
Promise
构造函数承受一个函数作为参数,该函数的两个参数别离是 resolve
和reject
。留神这两个是两个函数。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作胜利 */){resolve(value);
} else {reject(error);
}
});
resolve
函数的作用是,将 Promise
对象的状态从“未实现”变为“胜利”(即从 pending 变为 resolved),在异步操作胜利时调用,并将异步操作的后果,作为参数传递进来;
reject
函数的作用是,将 Promise
对象的状态从“未实现”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的谬误,作为参数传递进来。
Promise 执行程序
Promise
新建后就会立刻执行。
let promise = new Promise(function(resolve, reject) {console.log('11');
resolve();});
promise.then(function() {console.log('22');
});
console.log('33');
// 11
// 33
// 22
Promise 新建后立刻执行,所以首先输入的是 11
。then
办法指定的回调函数属于异步函数,在以后脚本所有同步工作执行完才会执行,所以输入 33
,22
最初输入。
异步加载图片案例
应用 Promise
包装了一个图片加载的异步操作。如果加载胜利,就调用 resolve
办法,否则就调用 reject
办法。
function loadImageAsync(url) {return new Promise(function(resolve, reject) {const image = new Image();
image.onload = function() {resolve(image);
};
image.onerror = function() {reject(new Error('Could not load image at' + url));
};
image.src = url;
});
}
Promise 对象实现的 Ajax
在 getTest
函数中对 XMLHttpRequest 对象进行了封装,发送一个 HTTP 申请,失去一个 Promise
对象。
const getTest = function(url) {const promise = new Promise(function(resolve, reject){const handler = function() {if (this.readyState !== 4) {return;}
if (this.status === 200) {resolve(this.response);
} else {reject(new Error(this.statusText));
}
};
const client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();});
return promise;
};
// 调用案例
getTest("/test.json").then(function(json) {console.log('Contents:' + json);
}, function(error) {console.error(error);
});
Promise 错误处理
如果 Promise 状态曾经变成resolved
,再抛出谬误是有效的。因为 Promise 的状态一旦扭转,就永恒放弃该状态,不会再变了。
Promise 对象的谬误具备 冒泡
性质,会始终向后传递,直到被捕捉为止。也就是说,谬误总是会被下一个 catch
语句捕捉。
const promise = new Promise(function(resolve, reject) {resolve('ok');
throw new Error('test');
});
promise
.then(function(value) {console.log(value) })
.catch(function(error) {console.log(error) });
// ok
感激
万能的网络
阮一峰的 es6 语法教程
以及勤奋的本人,集体博客,GitHub