Promise(fun_father)函数里包含了Promise(fun_son)函数,如果fun_father先resolve(),此时fun_son还没执行完,那么fun_son是会继续执行下去,还是终止?
let status= 0
const fun_father= () => {
return new Promise((resolve, reject) => {
fun_son().then(() => {
status= 1
})
//例如请求之类的异步方法......
resolve("fun_father done")
})
}
const fun_son = () => {
return new Promise((resolve ,reject) => {
//例如请求之类的异步方法......
resolve("fun_son done")
})
}
fun_father().then(msg => {
console.log(msg)
})
在写项目时碰到这种情况,简化后就是类似上面一样,我是希望能打印出"fun_father done",并且status也能改变为1。 这么写后,领导和我说如果fun_son执行得比fun_father快就没问题,但是如果反之,则会因为fun_father返回了,内存释放,fun_son就会终止执行。我对此还是有存疑的,但是自己试验的话没有好的测试异步方法(循环没用),setTimeout 是可以的,但不能完全说明。所以想请教大佬们,这样的写法是否可行。
首先,
Promise
的作用是控制异步流程,如果你想要保证打印fun_father done
的时候status
一定置为1,那么你可以写成这样:接下来,让我们来分析下楼主写法的执行栈
fun_father
函数,生成Promise
中的函数会立即执行fun_son
中生成Promise
的函数会立即执行,此时fun_son
中的异步方法加入异步事件队列,我们可以称作为fun_son_async
fun_father
中的异步方法并加入异步事件队列,我们可以称作为fun_father_async
示例代码(可以在浏览器执行查看结果)
fun_father_async
先返回,输出fun_father done但status为0这里可以看到,
fun_father_async
先返回了,并不会终止fun_son_async
及之后的执行fun_son_async
先返回,输出fun_father done但status为1更好的写法
既然用了
Promise
做异步流程控制,其实一个链式调用就可以了附录