Узел JS forEach проблема утечки памяти - PullRequest
0 голосов
/ 31 августа 2018

Я создавал приложение js для небольшого узла, которое перебирает массив имен и запрашивает API для имен. У меня проблема в том, что массив очень большой (400 000+ слов), и моему приложению не хватает памяти до завершения forEach.

Мне удалось диагностировать проблему, изучив, как JS работает со стеком вызовов, веб-интерфейсом API и очередью обратных вызовов. Я считаю, что проблема заключается в том, что цикл forEach блокирует стек вызовов, и поэтому запросы http продолжают забивать очередь обратного вызова, не решаясь.

Если кто-нибудь может предложить решение для разблокировки цикла forEach или альтернативный способ кодирования этого приложения, я был бы очень признателен.

Node JS App

const mongoose = require("mongoose");
const fs = require("fs");
const ajax = require("./modules/ajax.js");

// Bring in Models
let Dictionary = require("./models/dictionary.js");


//=============================
//     MongoDB connection
//=============================

// Opens connection to database "test"
mongoose.connect("mongodb://localhost/bookCompanion");
let db = mongoose.connection;

// If database test encounters an error, output error to console.
db.on("error", (err)=>{
  console.error("Database connection failed.");
});

db.on("open", ()=>{
  console.info("Connected to MongoDB database...");
}).then(()=>{

  fs.readFile("./words-2.json", "utf8", (err, data)=>{

    if(err){
      console.log(err);
    } else {
      data = JSON.parse(data);

      data.forEach((word)=>{
      let search = ajax.get(`API url Here?=${word}`);
      search.then((response)=>{
        let newWord = new Dictionary ({
          word: response.word,
          phonetic: response.phonetic,
          meaning: response.meaning
        }).save();
        console.log("word saved");
      }).catch((err)=>{
        console.log("Word not found");
      });
      });

    };
  });

});

1 Ответ

0 голосов
/ 31 августа 2018

Чек

  1. Проверьте, принимает ли API несколько параметров запроса.
  2. Попробуйте использовать асинхронные обещания.
  3. Разрешите обещания и попробуйте выполнить операцию сохранения на Promises с помощью Promise#all
...