Promise | 青训营笔记

86 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第12天。

以下是开发node.js时遇到的一些问题以及得到的一些经验。

使用Promise中出现的问题

为什么要使用Promise

有了promise对象就可以将异步函数以同步操作的流程表达出来,避免了层层嵌套的回调函数。

Promise可以使用.then(res=>{函数体的方式}),将上一个函数的返回值传递到下一个回调函数中去,这样就能保证上一个函数执行完成之后,再执行下一个函数,如下:

promise().then(res=>{
	//code
	return a
}).then(res=>{
	//code
	return b
}).then(res=>{
	//code
	return c
}).then(res=>{
	//code
	return d
}).then(res=>{
	//code
	return e
})

Promise到底是同步还是异步的?

Promise本身是同步的,而then和catch方法是异步的。

为什么Promise本身是同步的,来看如下代码:

console.log(1)
let a = new Promise((res,rej) => {
   console.log(2);
});
console.log(3);
let b = new Promise((res,rej) => {
    console.log(4);
});
console.log(5);

这段代码输出的结果是1,2,3,4,5

这就证明了Promise是同步的,但是,这没办法证明then和catch方法是异步的。

再看如下代码:

console.log(1)
let a = new Promise((res,rej) => {
    console.log(2);
    res();
});
console.log(3);
let b = new Promise((res,rej) => {
    console.log(4);
    res();
});
console.log(5);
a.then(() => {
    console.log(6)
})
b.then(() => {
    console.log(7)
})

这段代码,输出结果是1,2,3,4,5,6,7,这证明了then方法是同步的吗?我们再往下看:

console.log(1)
let a = new Promise((res,rej) => {
    res();
    console.log(2);
});
a.then(() => {
    console.log(6)
})
console.log(3);
let b = new Promise((res,rej) => {
    res();
    console.log(4);
});
b.then(() => {
    console.log(7)
})
console.log(5);

如果是同步,按理说输出的应该是1,6,2,3,7,4,5,但是结果却是1,2,3,4,5,6,7,这说明两个then函数都是按顺序且在最后执行,这不就是异步函数吗? 所以,结论成立。

总结

在我们的开发中要注意一些比较尖锐的问题,这些问题能够帮助我们更深的理解一些所学的知识,就比如在使用Promise的过程中,我真正理解了它的作用以及一些具体的细节,这都会帮助我更好的开发。