JavaScript中如何让Google Drive长耗时下载函数按同步顺序执行
问题根因
代码提前返回的核心原因是:pipe() 方法本身不返回Promise,你对它使用await不会等待流下载、写入完成,仅会等drive.files.export接口返回响应就直接结束异步函数,所以才会出现打印顺序错乱的问题。
修复方案
我们需要把流的处理过程手动包装成Promise,监听流的结束/报错事件来控制Promise的状态,这样await downloadFile()就可以真正等下载、写入全部完成再往下执行。
修复后的完整代码
module.exports = { download: async function (id) { // ... console.log("Starting downloading file"); await downloadFile(id, dest, jwtClient); console.log("Finished downloading file"); }, } async function downloadFile(fileId, dest, jwtClient) { const response = await drive.files.export( { fileId: fileId, mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", auth: jwtClient, }, { responseType: "stream", } ); // 手动包装流处理逻辑为Promise return new Promise((resolve, reject) => { const readStream = response.data; // 监听下载流报错 readStream.on("error", (err) => { console.log("DOWNLOAD ERROR: ", err); reject(err); }); // 监听写入流完成事件,确保文件完全写入磁盘 dest.on("finish", () => { console.log("END"); resolve(); }); // 监听写入流报错 dest.on("error", (err) => { console.log("WRITE ERROR: ", err); reject(err); }); // 启动流写入 readStream.pipe(dest); }); }
运行效果
修复后控制台的打印顺序会符合预期:
Starting downloading file
END
Finished downloading file
内容的提问来源于stack exchange,提问作者qnsi
相关产品推荐
相关产品推荐

