课件和 Demo 地址
https://gitee.com/geektime-geekbang/geek-nodejs
作者回复: const result = {}; let error = null; Promise.all([ promiseA.then(res=> { result['A'] = res; return res; }).catch(e=> { error = e; }), promiseB.then(res=> { result['B'] = res; return res; }).catch(e=> { error = e; }) ]).then(()=> { xxx }) 像这样写,所有的Promise就会在自己resolve之后把数据存在result里,然后所有的Promise在出错时也会把错误存起来,并且转到resolved状态 这样子,程序的逻辑就是Promise.all会等待所有的Promise执行完成,并且可以拿到所有Promise各自的结果。而不是“有任意Promise失败就回调。”
作者回复: 谢谢,录这段的时候已经有点困了
作者回复: 我试试这样表述: 1. 仅当Promise是resolved状态时,.then才会执行那个传入的函数。仅当Promise是rejected状态时,.catch才会执行那个传入的函数。 2. 若传入Promise.then和Promise.catch的函数被执行,会返回一个新的Promise。若不执行,直接返回这个Promise本身。 然后你把链式调用的每一次then和catch分开来理解,可能就会比较容易了。
作者回复: 通宵录课容易么
作者回复: 你提醒我了,then还可以传第二个参数,作用和catch一样。我习惯了then只传一个参数的情况,直接给忘了。 但是你这样抛错误,promise应该是不会进rejected状态的
作者回复: 发起请求还是串行的,毕竟node是单线程执行。 但等待请求的过程是并行的,
作者回复: 也有可能遇到promise了就一定resolve的好男人的(抠鼻)
作者回复: 有时候一个异步流程是由很多个子异步流程组合起来的。比如求职这个例子里整个求职过程是由三次面试组成的。 这时候你整个求职过程的成功和失败就取决于每一次的成功和失败。而不只是第一个promise
作者回复: 计划就是第二章面向初学者。后面会难的
作者回复: 我这边运行的结果和你预期是一致的。 极端点的猜想就是你500ms的那个延迟实际上延迟了不止500,而是超过了700,这样的话就会出现你看到的结果。可能是你电脑那时候太卡了? 因为setTimeout本身就具备不确定性,所以拿500 600 700这种数字来代表顺序本来就不严谨,只是课程里会用这种简单的方式处理。