JavaScript-ES6 Promise 基本了解

promise可以处理异步函数和回调地狱
// 这里补充一下,promise的提出就是为了解决回调函数地狱问题的。这不是一种新的语法,而是一种写法,允许将回调函数的嵌套改为链式调用。 —7.9

例1:

let promise = new Promise((resolve, reject) = > {
    
    
	/* 这里进行一系列操作 */
	if (/* 满足条件 */) {
    
    
		resolve(value) // value可以是请求返回的值啊 或者在这里面处理好的数据 或者是另一个Promise实例
	} else {
    
    
		reject(err) // 这里的value和err都会作为参数传出去 给对应的then 和 catch内的函数使用
	}
})

promise.then((value) => {
    
    
	console.log(value)
}).catch((err) => {
    
    
	console.log(err)
})

例2:

let p1 = new Promise((resolve, reject) => {
    
    
	setTimeout(()) => reject(new Error('fail'), 3000)
})
let p2 = new Promise((resolve, reject) => {
    
    
	setTimeout(() => resolve(p1), 1000)
})

p2.then((res) => {
    
    
	console.log('p2成功:' + res)
}).catch((err) => {
    
    
	console.log('p2失败:' + err)
}) // p2失败:fail

在以上代码中,p2resolve函数返回的是另一个异步操作,p1的状态会传递给p2,因此最后打印的是p2失败,而不是p2成功
执行过程为,第一秒结束时 p2 执行resolve函数,因为p2的resolve返回的是另一个Promise,就导致了p2状态无效,触发的是p2的catch,其实then语句针对的都是p1的,再过两秒,p1传出一个reject状态,触发catch打印结果。

ps: promise的特点是,在建立的时候就会执行。如果resolve前面有一句打印,那打印语句就会在then之前执行,这与js的事件循环有关,promise事件属于微事件,在事件循环中,首先整个js作为一个宏事件执行一遍,遇到内部的宏事件就放到相应事件队列,遇到微事件就放到另一个事件队列中,promise建立时内部的语句属于第一遍宏事件的内容,所以会直接执行,整个宏事件执行完毕后,首先检查微事件队列,执行,然后检查宏事件队列,执行,promise事件执行(then,catch等)的时候是微事件,注意与建立时的内部语句区分。
reject和resolve并不会结束promise的执行,因此建议在resolve和reject的前面加上return,这样后面的语句就不会执行了。

猜你喜欢

转载自blog.csdn.net/weixin_45543674/article/details/118556405