Запуск do в то время как l oop приводит к фатальной ошибке - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь использовать API Google Drive для получения списка файлов в определенной папке. Теперь, когда я пытаюсь запустить do.. while l oop, чтобы получить список файлов маленькими порциями, приложение вылетает с фатальной ошибкой:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory  

Snippet

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 будет неопределенным, если больше нет файлов.

1 Ответ

1 голос
/ 19 апреля 2020

Полагаю, вы слышали о термине "асин c" в JS. По-видимому, drive.files.list - это асин * функция c в стиле обратного вызова. И это pageToken = res.data.nextPageToken присваивание происходит внутри этого обратного вызова, что означает, что значение pageToken не изменяется мгновенно с null на something

Однако вы делаете ... в то время как logi c происходит синхронно. Таким образом, while(!pageToken) в основном равно while(true). Вот почему вы получили ошибку, ваша программа застряла в бесконечном l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...