You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:57:02