运行 while 循环导致致命错误
Running do while loop results in fatal error
我正在尝试使用 google 驱动器 api 来获取特定文件夹中的文件列表。现在,当我尝试 运行 do..while 循环以获取小块文件列表时,应用程序崩溃并出现致命错误:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
片段
function listFiles(auth) {
const drive = google.drive({ version: "v3", auth });
let pageToken = null;
do {
drive.files.list({
pageSize: 10,
q: "'root' in parents and trashed=false",
fields: "nextPageToken, files(id, name)",
pageToken: pageToken,
}, (err, res) => {
if (err) return console.error(`The API returned an error: ${err}`);
pageToken = res.data.nextPageToken;
const files = res.data.files;
if (files.length) {
files.forEach((file) => {
console.log(`${file.name} (${file.id})`);
});
} else {
console.log("No files found!");
}
});
}
while(!pageToken);
AFAIK 如果没有更多文件,nextPageToken 将是未定义的。
相信大家听说过JS中的"async"这个词。显然 drive.files.list
是一个回调风格的异步函数。而这个 pageToken = res.data.nextPageToken
赋值发生在回调中,这意味着 pageToken 的值不会立即从 null
更改为 something
但是您的 do...while 逻辑是同步发生的。因此 while(!pageToken)
基本上等于 while(true)
。这就是你得到错误的原因,你的程序陷入了无限循环。
我正在尝试使用 google 驱动器 api 来获取特定文件夹中的文件列表。现在,当我尝试 运行 do..while 循环以获取小块文件列表时,应用程序崩溃并出现致命错误:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
片段
function listFiles(auth) {
const drive = google.drive({ version: "v3", auth });
let pageToken = null;
do {
drive.files.list({
pageSize: 10,
q: "'root' in parents and trashed=false",
fields: "nextPageToken, files(id, name)",
pageToken: pageToken,
}, (err, res) => {
if (err) return console.error(`The API returned an error: ${err}`);
pageToken = res.data.nextPageToken;
const files = res.data.files;
if (files.length) {
files.forEach((file) => {
console.log(`${file.name} (${file.id})`);
});
} else {
console.log("No files found!");
}
});
}
while(!pageToken);
AFAIK 如果没有更多文件,nextPageToken 将是未定义的。
相信大家听说过JS中的"async"这个词。显然 drive.files.list
是一个回调风格的异步函数。而这个 pageToken = res.data.nextPageToken
赋值发生在回调中,这意味着 pageToken 的值不会立即从 null
更改为 something
但是您的 do...while 逻辑是同步发生的。因此 while(!pageToken)
基本上等于 while(true)
。这就是你得到错误的原因,你的程序陷入了无限循环。