Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用for/loop(forEach)将多个文件上载到GoogleDrive API_Javascript_Node.js_For Loop_Asynchronous_Foreach - Fatal编程技术网

Javascript 如何使用for/loop(forEach)将多个文件上载到GoogleDrive API

Javascript 如何使用for/loop(forEach)将多个文件上载到GoogleDrive API,javascript,node.js,for-loop,asynchronous,foreach,Javascript,Node.js,For Loop,Asynchronous,Foreach,我使用GoogleDrive API上传多个文件。 我在上传多个文件时遇到内存不足的问题。我尝试在代码中使用forEach(for循环),以避免同时上载多个文件,但它没有按照我预期的方式工作。它总是在整个文件列表中循环并同时上载 我尝试使用async/await语法来阻止循环,但它没有按我预期的方式工作。 这是我的密码: const fs=require(“fs”); const readline=require(“readline”); const{google}=require(“goog

我使用GoogleDrive API上传多个文件。 我在上传多个文件时遇到内存不足的问题。我尝试在代码中使用forEach(for循环),以避免同时上载多个文件,但它没有按照我预期的方式工作。它总是在整个文件列表中循环并同时上载

我尝试使用async/await语法来阻止循环,但它没有按我预期的方式工作。 这是我的密码:

const fs=require(“fs”);
const readline=require(“readline”);
const{google}=require(“googleapis”);
让files=[“file1.mp4”,“file2.mp4”];
常量范围=[”https://www.googleapis.com/auth/drive.metadata.readonly"];
const TOKEN_PATH=“TOKEN.json”;
fs.readFile(“credentials.json”,(err,content)=>{
if(err)返回console.log(“加载客户端机密文件时出错:”,err);
//使用凭据授权客户端,然后调用Google Drive API。
授权(JSON.parse(content),上传文件);
});
函数授权(凭据、回调){
const{client\u secret,client\u id,redirect\u uris}=credentials.installed;
const oAuth2Client=new google.auth.OAuth2(
客户id,
客户的秘密,
重定向URI[0]
);
//检查我们以前是否存储过令牌。
fs.readFile(令牌路径,(错误,令牌)=>{
if(err)返回getAccessToken(oAuth2Client,回调);
oAuth2Client.setCredentials(JSON.parse(token));
回调(oAuth2Client);
});
}
函数getAccessToken(oAuth2Client,回调){
const authUrl=oAuth2Client.generateAuthUrl({
访问类型:“脱机”,
范围:范围
});
log(“通过访问此url授权此应用:”,authUrl);
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
rl.question(“在此处输入该页面的代码:”,代码=>{
rl.close();
oAuth2Client.getToken(代码,(错误,标记)=>{
if(err)返回console.error(“检索访问令牌时出错”,err);
oAuth2Client.setCredentials(令牌);
//将令牌存储到磁盘,以便以后执行程序
writeFile(TOKEN_PATH,JSON.stringify(TOKEN),err=>{
if(err)控制台错误(err);
日志(“令牌存储到”,令牌路径);
});
回调(oAuth2Client);
});
});
}
异步函数上载文件(auth){
用于(文件的文件){
var fileMetadata={
名称:文件
};
var媒体={
正文:fs.createReadStream(“test/”+文件)
};
drive({version:“v3”,auth});
const result=wait drive.files.create(
{
资源:fileMetadata,
媒体:媒体,,
字段:“id”
},
函数(错误,文件ID){
如果(错误){
//处理错误
控制台错误(err);
}否则{
log(“文件Id:”,fileid.data.Id);
console.log(“上传的..:”+文件);
}
}
);
console.log(“上传文件..:”+文件);
}
}
我尝试在代码中使用forEach(for循环),以避免同时上载多个文件

你不能,这个过程是完全异步的。您将回调作为参数传递给函数
drive.files.create

顺便说一下,如果您想使用
async/await
,您应该将您的函数包装成一个预期的函数

function myCreateFunc (fileInfos) {
    return new Promise((resolve, reject) => {
            google.drive.create(filesInfos, function callback(err, fileId) {
                    if(err)
                        reject(err)

                    resolve(fileId)
            })
    });
}
我尝试在代码中使用forEach(for循环),以避免同时上载多个文件

你不能,这个过程是完全异步的。您将回调作为参数传递给函数
drive.files.create

顺便说一下,如果您想使用
async/await
,您应该将您的函数包装成一个预期的函数

function myCreateFunc (fileInfos) {
    return new Promise((resolve, reject) => {
            google.drive.create(filesInfos, function callback(err, fileId) {
                    if(err)
                        reject(err)

                    resolve(fileId)
            })
    });
}

那么,我如何每次上传一个文件?你有什么见解吗?将
drive.files.create
包装到一个函数中,该函数将返回一个承诺;我将在我的主要帖子中添加一个例子。谢谢你的建议。我已经看过你的解决方案了,但是我不能把我的脑袋绕过去和for循环结合起来。每当google.drive.create返回时,解析就会返回此承诺。但是我怎么能重复这个承诺呢?你最初要求避免同时上传所有文件,事实上你不能,因为异步代码不能同步和阻塞。我还告诉过你如何使用承诺。减少RAM占用量的一个解决方案是发送一些文件的块,而不是完全写入单个缓冲区。那么,如何每次上载一个文件?你有什么见解吗?将
drive.files.create
包装到一个函数中,该函数将返回一个承诺;我将在我的主要帖子中添加一个例子。谢谢你的建议。我已经看过你的解决方案了,但是我不能把我的脑袋绕过去和for循环结合起来。每当google.drive.create返回时,解析就会返回此承诺。但是我怎么能重复这个承诺呢?你最初要求避免同时上传所有文件,事实上你不能,因为异步代码不能同步和阻塞。我还告诉过你如何使用承诺。减少RAM占用量的解决方案是发送一些文件的块,而不是完全写入单个缓冲区。