Для циклов перерывы при использовании ждут - PullRequest
0 голосов
/ 13 апреля 2020

У меня проблема при использовании await в течение l oop. Каждый раз, когда он запускает функцию ожидания, он выполняет его нормально, но перестает перескакивать через остальную часть массива, который проходит по циклу. Я использую nodejs с топором ios для отправки http-запроса на restAPI. Функция в API большая. Так что я подумала, что это проблема Мейби, но это не так. Кроме того, API использует свои собственные функции await, но это не было проблемой (насколько я знаю).

Вот мой код для запроса

    var files = await globPromise("assets/series/**/*.json");
    var json = null;
    var file = null;
    var series = [];
    for (i = 0; i < files.length; i++) {
        file = files[i];
        var raw = fs.readFileSync(file);
        json = JSON.parse(raw);
        if (json.type === "series") {
            try {
                var userId = null;
                if (req.user == null) {
                    userId = req.query.userid;
                } else {
                    userId = req.user.id;
                }
                const response = await axios.get("http://" + host + "/series/info/" + json.id + "?userid=" + userId);
                series.push(JSON.parse(response.data));
            } catch (error) {
                console.log(error);
                series.push(json);
            }
        }
    }
    res.json(JSON.stringify(series));
});

А также сторона API:

app.get('/series/info/:id', async(req, res) => {
    var files = await globPromise("assets/series/**/*.json");
    var json = null;
    var file = null;
    for (i = 0; i < files.length; i++) {
        file = files[i];
        var raw = fs.readFileSync(file);
        json = JSON.parse(raw);
        if (json.type === "series" && json.id === req.params.id) {
            break;
        }
        json = null;
    }

    let path = pathFs.dirname(file) + "/";
    try {
        var seriesFiles = await fsPromise.readdir(path);
        var latestWatchedVideo = null;
        var latestWatchedTime = null;
        var latestWatchTime = null;
        var latestWatchDuration = null;
        var seasonCount = 0;
        var seasons = [];
        for (i = 0; i < seriesFiles.length; i++) {
            seriesFile = seriesFiles[i];
            if (fs.lstatSync(path + "/" + seriesFile).isDirectory()) {
                if (!seriesFile.startsWith("s")) {
                    continue;
                }
                seasonCount++;
                try {
                    var videoFiles = await fsPromise.readdir(path + "/" + seriesFile + "/");
                    var videos = [];
                    for (let i = 0; i < videoFiles.length; i++) {
                        const video = videoFiles[i];
                        if (video.endsWith(".json")) {
                            var rawVideo = fs.readFileSync(path + "/" + seriesFile + "/" + video);
                            videoJson = JSON.parse(rawVideo);
                            const query = util.promisify(con.query).bind(con);
                            var userId = null;
                            if (req.user == null) {
                                userId = req.query.userid;
                            } else {
                                userId = req.user.id;
                            }
                            var results = await query(`SELECT * FROM watched WHERE video_id = "${videoJson.id}" AND user_id = "${userId}"`);
                            if (results.length > 0) {
                                var updated = JSON.parse(JSON.stringify(results[0].updated));
                                var duration = JSON.parse(JSON.stringify(results[0].duration));
                                var time = JSON.parse(JSON.stringify(results[0].time));
                                if (latestWatchedVideo == null) {
                                    latestWatchedVideo = videoJson.id;
                                    latestWatchedTime = updated;
                                    latestWatchTime = time;
                                    latestWatchDuration = duration;
                                } else {
                                    if (latestWatchedTime < updated) {
                                        latestWatchedVideo = videoJson.id;
                                        latestWatchedTime = updated;
                                        latestWatchTime = time;
                                        latestWatchDuration = duration;
                                    }
                                }
                            }
                            videos.push(videoJson);
                        }
                    }

                    function compare(a, b) {
                        if (a.episode < b.episode) {
                            return -1;
                        }
                        if (a.episode > b.episode) {
                            return 1;
                        }
                        return 0;
                    }

                    videos.sort(compare);
                    seasons.push({
                        season: seasonCount,
                        title: seriesFile.replace("s" + seasonCount, ""),
                        videos: videos
                    });
                } catch (error) {
                    console.log(error);
                }
            }
        }
        json.seasonCount = seasonCount;
        json.seasons = seasons;
        json.latestWatchDuration = latestWatchDuration;
        json.latestWatchTime = latestWatchTime;
        json.latestWatchedVideo = latestWatchedVideo;
        json.latestWatchedTime = latestWatchedTime;

        res.json(JSON.stringify(json));
    } catch (error) {
        console.log(error);
    }
});

Есть ли что-то (важное) в await и asyn c, которое я пропустил?

Правка: моя проблема в том, что цикл проходит через первый item и await тоже работают нормально, но он останавливает l oop и выполняет следующие строки кода, как будто в моем массиве нет других элементов.

Решено: Я пытался использовать for / of и это работает сейчас. Я не знаю, в чем разница между де-по умолчанию и этим, но это работает!

...