这是我参与「第四届青训营 」笔记创作活动的第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的过程中,我真正理解了它的作用以及一些具体的细节,这都会帮助我更好的开发。