异步编程之Promise
Promise简单的来说就是当前时间得不到的结果,但未来的事件循环会给到你结果,用于一个异步操作的最终完成及结果值的表示。
语法:
new Promise(function(resolve,reject){
...
...
})
.then(){
...
}
.catch
Promise有三个状态
pending:还没有得到结果的状态,可以转换为fulfilled/resolved/rejected;
fulfilled/resolved:得到了一个正确的结果,意味着操作成功完成。
rejected:得到了一个错误的结果,意味着操作失败;
Promise.resolve()返回一个fulfilled状态的Promise实例,或者原始Promise实例
1、参数为空,返回一个状态为fulfilled的Promise实例
2、参数是一个跟Promise无关的值,同样是返回一个状态为fulfilled的Promise实例,或者原始Promise实例,但是fulfilled响应函数会得到这个参数
3、参数为Promise实例,则返回该实例,不做任何修改
4、参数为thenable,则立刻执行.then()
Promise.reject()不认thable,返回一个rejected的Promise实例。
任何一个rejected状态且后面没有.catch()的Promise,都会造成浏览器/Node环境的全局错误
(function () {
var promise = new Promise(function (resolve, reject) {
setTimeout(() => {
// resolve(3);
reject(new Error(3));
}, 300);
})
.then(function (res) {
console.log("then");
console.log(res);
})
.catch(function (err) {
console.log("catch");
console.log(err);
});
console.log(promise);
setTimeout(() => {
console.log(promise);
}, 800)
})();
执行catch呵then都可以返回一个全新的Promise,该Promise最终状态根据then和catch的回调函数执行结果决定。
如果回调函数最终是throw,该Promise是rejected状态
如果该回调函数最终是return,该Promise是resolved状态
(function () {
var promise = interView();
var promise2 = promise
.then((res) => {
// console.log("accept");
throw new Error("refuse");
// return "success";
})
.catch((err) => {
// console.log("error");
throw new Error("refuse");
// return "success";
});
setTimeout(() => {
console.log(promise);
console.log(promise2);
}, 800);
var promise = interView(1)
.then(() => {
return interview(2);
})
.then(() => {
return interview(3);
})
.then(() => {
console.log("smile");
})
.catch((err) => {
console.log("error");
});
Promise.all([p1,p2,p3,...])
用于将多个Promise实例包装成一个新的Promise实例,返回的实例就是普通的Promise
接受一个数组作为参数
数组里可以实Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有子Promise都完成,该Promise完成,返回值是全部值 的数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的错误
Promise.all([
interView('geekbang'),
interView('tencent')
])
.then(()=>{
console.log('smile');
})
.catch((err)=>{
console.log(err.name)
})
})();
function interView(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.2) {
resolve("success");
} else {
var error=new Error('fail');
error.name=name;
reject(error);
}
}, 800);
});
}