ECMAscript 6 原生提供了 Promise 对象。
Promise
Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息,是一套异步操作处理机制。
实现一个简单的Promise,具备then 与 catch方法
// 如有精力,考虑一下如何实现链式调用
function myPromise(executor){
// ...你的实现
}
new myPromise((res,rej)=>{
console.log(1)
res('success')
}).then(console.log)
new myPromise((res,rej)=>{
console.log(2)
rej('error')
}).then(console.log)
.catch(err=>{
console.log('----')
console.log(err)
})
一、Promise特点
- 可以在一系列异步操作中,灵活地处理错误,避免了层层嵌套的回调函数。
Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
二、Promise的创建
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 调用resolve */){
resolve(value);
} else {
/* 异步操作失败 调用reject */
reject(error);
}
});
resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;
三、Promise.prototype.then()
Promise实例生成以后,可以用then方法(then方法是定义在原型对象Promise.prototype上的。它的作用是为 Promise 实例添加状态改变时的回调函数。)、catch方法分别指定Resolved状态和Rejected状态的回调函数:
ew Promise(function(resolve,reject) {
let num = Math.random() * 2;
console.log("产生的随机数为:" + num);
setTimeout(function () {
if(num < 1) {
console.log("执行成功");
resolve("200 OK");
} else {
console.log("执行失败");
reject("失败原因num为:" + num);
}
}, num * 1000);
}).then(function(r) {
console.log("then:" + r);
}).catch(function(j) {
console.log("catch:" + j);
});
四、Promise.prototype.catch()
Promise.prototype.catch()方法用于指定发生错误时的回调函数。
const p1 = new Promise(function cb(resolve, reject) {
setTimeout(() => {
console.log('欢迎')
reject()
}, 3000)
})
p1.then(_ => {
setTimeout(() => {
console.log('谢谢光临')
}, 2000)
}).catch(_ => {
console.log('出错了')
})
当promise抛出一个错误,就被catch()方法指定的回调函数捕获。
如果 Promise 状态已经变成resolved,再抛出错误是无效的。
五、Promise.prototype.finally()
finally()方法返回一个Promise。
在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise是否成功完成后都需要执行的代码提供了一种方式。
这避免了同样的语句需要在**then()和catch()**中各写一次的情况。
p.finally(onFinally);
p.finally(function() {
// 返回状态为(resolved 或 rejected)
});
参数:
- onFinally
- Promise 结束后调用的Function。
返回值:
- 返回一个设置了 finally 回调函数的Promise对象。
六、Promise.all()
Promise.all(iterable)方法返回一个实例,此实例在 iterable参数内所有的promise都“完成(resolved)或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Promise对象解决回调地狱层层嵌套的问题。
通过then方法分别制定resolved状态和rejected状态的回调函数。
Promises
可以做很多事情。如果有什么返回了一个promise
,你可以在后面加上 .then()
来传入成功和失败的回调函数。或者,你可以在后面加上 .catch()
如果你想添加一个操作失败的回调函数。
同步回调结构,和异步promise结构
传统的同步回调结构,和异步promise结构
同步
try {
var value = myFunction();
console.log(value);
} catch(err) {
console.log(err);
}
异步
myFunction().then(function(value) {
console.log(value);
}).catch(function(err) {
console.log(err);
});
第一个同步例子中,必须等待 myFunction( )
执行完成,并返回 value
值,在此之前,后续其它的代码无法执行。
第二个异步例子中,myFunction( )
返回一个promise
对象,下面的代码可以继续执行。当promise
成功resolves
后,then( )
中的函数会异步地执行。
参考大佬:https://blog.csdn.net/m0_46532221/article/details/106528918
拜