请教个关于Promise异步的问题

请教个关于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是什么意思?


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,reslove后的代码是同步执行,第一种chan的方法是像微任务中依次加入三个方法的,而第二种是直接向微任务中加入一个方法,第一种chan里面的代码会依次执行微任务,第二种是"一下"执行里面的代码,promise对象有是三种状态:pending(初始状态),fulfilled(操作成功),rejected(操作失败),Promise.resolve()返回的是一个fulfilled状态的 Promise 对象。chan是一个变量名,这个是可以修改的。

Sam 2021-12-19 10:28:33

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(" ");
});
  • 提问者 jindong #1

    老师您好,感谢您的解答,我大概明白您的意思了。但是我还有一点疑问,既然promise chain.then是为了解决异步调用的问题,那async/await是否也可以解决类似的问题并且async/await应该更简洁吧?lerna使用promise chain.then主要是考虑哪些方面的因素呢?


    async/await代码如下:

    async function test() {
      let result1 = await func1()
      let result2 = await func2(result1)
      let result3 = await func2(result2)
      return result3
    }


    2021-12-19 23:40:46
  • 慕少8046751 回复 提问者 jindong #2

    在链式调用的场景下,理论上你上面的async/await写法和lerna源码的promise chain写法效果是一样的。但是async比promise出得晚是ES7语法,promise属于ES6语法,所以使用比较广泛。

    其次,同步异步函数本质是generator的语法糖,每一步await执行是阻塞的,我个人感觉没有很清晰的体现任务队列的思想,个人猜想promise chain的写法也是体现了设计者的任务队列设计思想

    最后,async/await无法完全替代promise,比如在处理并发请求时。试想一个场景,如何同时发出3个独立的请求,且等三个请求都回来之后再继续下面的操作?async/await固然可以,但是如果我要并发出去呢?

    2021-12-27 20:51:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师