为何Promise.all的then方法需用匿名函数而非直接调用函数?
为什么Promise.all的then直接调用函数不生效?
核心问题出在then方法对参数的要求上,直接给你拆解清楚:
then方法需要接收一个函数作为回调,这个函数会等到Promise状态变为resolved后才会被调用执行。你用匿名函数的写法:
Promise.all(jarOfPromise) .then(_ => { drawAllCard(images); });这里传给
then的是一个箭头函数,当Promise.all的所有异步操作完成后,这个箭头函数才会被触发,此时调用drawAllCard(images)的时机是对的——images已经准备好,自然能正常运行。而直接调用的写法:
Promise.all(jarOfPromise) .then(drawAllCard(images));你是立即执行了
drawAllCard(images),然后把这个函数的返回值传给了then。如果drawAllCard没有返回一个可执行的函数,那then拿到的就是undefined(或其他非函数值),这种情况下then会直接忽略这个无效回调,不会在Promise完成后触发任何操作。而且你提前执行了drawAllCard(images),此时Promise.all的异步任务还没结束,images可能还没准备好,只是刚好没抛出错误而已。
如果想不用匿名函数,有两种正确写法:
- 若
drawAllCard不需要额外参数:直接传函数本身then(drawAllCard) - 若需要绑定
images参数:用bind生成新函数then(drawAllCard.bind(null, images)),这样then会在合适时机调用这个新函数,并自动把images传给drawAllCard
内容的提问来源于stack exchange,提问作者Clingonboy
相关产品推荐
相关产品推荐

