Javascript下Google Drive Api v3批量公开共享文件及请求等待实现咨询
问题解答
1. 现有函数运行情况
现有函数可以正常触发权限设置请求的发送,但存在两个核心缺陷:
- 函数没有返回值,无法通过
await等待所有请求执行完成,调用后会立刻执行后续逻辑,无法实现你需要的「所有操作完成再走后续流程」的效果 - 没有错误捕获逻辑,单个文件的权限设置失败无法感知,也不会抛出异常通知上层逻辑
2. 改造为支持await的Promise结构
Google Drive API v3的execute方法支持传入回调函数来接收响应结果/错误信息,我们可以把单个文件的权限设置请求包装为独立Promise,再用Promise.all合并所有请求的Promise,最终返回整体Promise即可实现等待效果,改造后代码如下:
async function generateFilesPublicly(ids) { // 遍历所有文件ID,把每个权限设置请求包装为独立Promise const permissionPromises = ids.map(id => { return new Promise((resolve, reject) => { drive.permissions.create({ 'fileId': id, 'resource': { 'type': 'anyone', 'role': 'reader' // 注意:原有代码里的value: 'default'是v2版本API的参数,v3版本不需要传,保留可能触发无效参数警告,建议删除 } }).execute((response, error) => { if (error) { reject(new Error(`文件${id}权限设置失败: ${error.message}`)) } else { resolve(response) } }) }) }) // 等待所有请求完成,所有请求成功才会正常返回,任意一个请求失败都会抛出异常 return Promise.all(permissionPromises) }
补充说明:
- 改造完成后即可直接使用
await generateFilesPublicly(ids)的形式调用,所有权限设置请求成功完成后才会执行后续代码 - 如果需要兼容「部分请求失败仍然继续执行后续逻辑」的场景,可以把
Promise.all替换为Promise.allSettled,调用后自行遍历结果判断每个请求的成功/失败状态即可
内容的提问来源于stack exchange,提问作者Alara
相关产品推荐
相关产品推荐

