JS Promise异步执行顺序异常如何正确实现同步等待?
问题原因
执行顺序错乱的核心是Promise链断裂:处理msg.photo逻辑时,tg_bot.getFileLink返回的Promise没有被外层Promise链接收,外层.then()不会等待该内部异步操作执行完成,就会直接进入后续环节调用webhookClient.send(temp),此时temp['files']赋值、contains自增逻辑尚未执行完毕。
正确实现
最不容易出错的写法是用async/await语法,按同步逻辑写异步代码,不需要手动维护Promise链的return关系:
// 异步函数包裹逻辑 const handleForward = async () => { let contains = 0; const temp = { username: `${msg.from.first_name} tg`, }; // 拉取用户头像链接 const userProfile = await tg_bot.getUserProfilePhotos(msg.from.id); temp.avatarURL = await tg_bot.getFileLink(userProfile.photos[0][0].file_id); // 处理文本消息 if (msg.text !== undefined) { temp.content = msg.text; contains++; } // 处理图片消息,等待文件链接拉取完成再往下走 if (msg.photo !== undefined) { const latestPhotoId = msg.photo.slice(-1)[0].file_id; const fileLink = await tg_bot.getFileLink(latestPhotoId); temp.files = [fileLink]; contains++; } // 所有异步操作完成后再执行发送 if (contains <= 0) temp.content = 'empty'; console.log(temp); webhookClient.send(temp); }; // 执行逻辑,记得加错误捕获 handleForward().catch(err => { console.error('消息处理失败:', err); });
如果要保留原有.then()链式写法,必须保证每一个内部产生的Promise都被return到外层链上,否则就会出现不等待的问题。以原有photo处理逻辑为例,必须写成如下形式才能正常等待:
.then(() => { if (msg.photo !== undefined) { // 一定要return这个Promise,外层链才会等它执行完 return tg_bot.getFileLink(msg.photo.slice(-1)[0].file_id) .then(link =>{ temp['files'] = [link]; contains++; }) } })
注意:只要是在
.then()回调里执行异步操作返回Promise,就必须手动return,否则Promise链不会感知到这个异步任务,直接进入下一环节。
内容的提问来源于stack exchange,提问作者BURAKKU
相关产品推荐
相关产品推荐

