promise
解决了什么痛点,说是解决了回调地狱问题,并没有明白;
状态
一共有3中状态;
pending:即将发生的,new Promise()执行后就会是该状态;
fulfilled:成功后的状态;
rejected:失败后的状态;
只有2中变化情况:
1 pending --> fulfilled
2 pending --> rejected
用法
const promise = new Promise((resolve, reject) => {
// 此处进行异步处理
const result = // 一些异步操作后返回的信息
if(result.code == '成功'){
// 成功时执行
resolve(result);
}else{
// 失败时执行
reject(result);
}
});
// 调用
promise.then((res) => {
// 成功时的处理
console.log(res);
}).catch((err) => {
// 失败时的处理
console.log(err);
});
示例
const myAjax = (url, param) => {
return new Promise((resolve, reject) => {
$.ajax({
type: 'json', url: url, data: param,
success: (res) => {
resolve(res);
},
error: (err) => {
reject(err);
}
});
});
}
const url = "http://www.test.com/login";
const param = {"name": "123", "pwd": "456"};
myAjax(url, param).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
链式操作
可以使用多个then()来执行各层级的回调函数;
这么写是有点优雅,可读性很强;
catch()后也可以接then();
var promise = new Promise((resolve, reject) => {
resolve("成功!");
});
promise.then((res) => {
console.log("第一个then: " + res);
// 使用return把值传递给下一个then,没有return时会导致下一个then接收不到参数
return res + "1";
}).then((res) => {
console.log("第二个then: " + res);
});
// 结果
// 第一个then: 成功!
// 第二个then: 成功!1
catch处理错误
catch能处理异步操作的错误;
catch也能处理执行链之前的错误;
var promise = new Promise((resolve, reject) => {
resolve("成功!");
});
promise.then((res) => {
console.log("第一个then: " + res);
// 此处abc未定义
return abc;
}).then((res) => {
console.log("第二个then: " + res);
return res + "2";
}).catch((err) => {
console.log("错误: " + err);
});
// 结果
// 第一个then: 成功!
// 错误: ReferenceError: abc is not defined
其他方法
all
var promises = new Promise.all([p1,p2,p3]);
传递多个promise对象;
有2中情况:
1 数组中的promise都resolve后,promises 才resolve;
2 数组中的promise有一个reject,则promises就会reject;
race
和all使用方式一样,情况不同;
只要有一个状态发生变化,则promises就会被执行
resolve、reject
把非promise对象变成promise对象;
var promise = Promise.resolve(“非promise对象”); 用then()来接着处理;
var promise = Promise.reject(“非promise对象”);用catch()来接着处理;