请教个关于Promise异步的问题
//---------------第一种方案------------
new Promise(() => {
let chan = Promise.resolve()
chan.then(() => console.log('chan1'))
chan.then(() => console.log('chan2'))
chan.then(() => console.log('chan3'))
})
//---------------第二种方案------------
new Promise(() => {
let chan = Promise.resolve()
chan.then(() => {
console.log('chan11')
console.log('chan22')
console.log('chan33')
})
})
老师,请教个问题,resolve后面都是同步执行对吗?以上两种写法作用是一样的吗?为啥lerna的runner使用第一种写法而不使用第二种写法?第二种写法那么简单
-------------------
顺便再一下,Promise.resolve()返回的是什么样的对象?跟普通的Promise对象有什么区别?起名叫chan是什么意思?
正在回答
同学你好,reslove后的代码是同步执行,第一种chan的方法是像微任务中依次加入三个方法的,而第二种是直接向微任务中加入一个方法,第一种chan里面的代码会依次执行微任务,第二种是"一下"执行里面的代码,promise对象有是三种状态:pending(初始状态),fulfilled(操作成功),rejected(操作失败),Promise.resolve()返回的是一个fulfilled状态的 Promise 对象。chan是一个变量名,这个是可以修改的。
hello,同学,你的观察非常仔细,先点个赞
课程里的场景比较简单,所以Promise chain的用法和同步做法几乎没有区别,甚至同步会更加简单一些。Promise chain的优势在于取代回调。试想下面的场景:
A类中执行完一些同步业务逻辑后,如何传递给B类继续执行?
传统的做法就是使用回调函数,最典型的就是webpack中的地狱式回调。但是用Promise chain就可以有效的解决这个问题,我们只需要return Promise对象,B类中接收Promise对象然后继续.then执行就可以了,大大简化了回调逻辑。我们可以通过Lerna源码大量看到这样的应用:
let chain = Promise.resolve(); chain = chain.then(() => getFilteredPackages(this.packageGraph, this.execOpts, this.options)); chain = chain.then(filteredPackages => { this.filteredPackages = filteredPackages; }); return chain.then(() => { this.count = this.filteredPackages.length; this.packagePlural = this.count === 1 ? "package" : "packages"; this.joinedCommand = [this.command].concat(this.args).join(" "); });
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星