Promise
最后更新于:2022-04-02 03:27:32
[TOC]
## Promise
```
var promise = new Promise(function (resolve, reject) {
// ...
if (/* 异步操作成功 */){
resolve(value);
} else { /* 异步操作失败 */
reject(new Error());
}
});
promise.then(function (e) {
console.log(e);
}).catch(function (e) {
console.log(e);
})
```
### 简单实例
```
// ajax函数将返回Promise对象:
function ajax(method, url, data) {
var request = new XMLHttpRequest();
return new Promise(function (resolve, reject) {
request.onreadystatechange = function () {
if (request.readyState === 4) {
if (request.status === 200) {
resolve(request.responseText);
} else {
reject(request.status);
}
}
};
request.open(method, url);
request.send(data);
});
}
//执行
var p = ajax('GET', '/api/categories');
p.then(function (text) { // 如果AJAX成功,获得响应内容
console.log(text);
}).catch(function (status) { // 如果AJAX失败,获得响应代码
console.log(text);
});
```
在 ES6 中使用
```
var func = new Promise((resolve,reject)=>{
fs.readFile("./demo.html", (err, data)=> {
if (err) reject(err)
else resolve(data)
})
})
func.then(data=>{
console.log(data);
}).catch((err)=>{
console.log(err);
});
```
### Promise.all 等到都完成
### Promise.race 有一个完成
```
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 获得一个Array: ['P1', 'P2']
});
//只需要获得先返回的结果即可,增加容错,如同时向两个URL读取用户的个人信息
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P1'
});
```
';