2016-12-05 3 views
1

У меня возникли некоторые проблемы с тем, что, по моему мнению, является основной проблемой использования обещаний в приложении на стороне узла node.JS. К сожалению, я не вижу, как его разрешить, несмотря на другие подобные вопросы (я думаю).Итерация через дорогую функцию async - ограничения памяти, рекурсия?

В основном моя проблема заключается в следующем: Я пытаюсь получить некоторые внешние данные, а затем обработать их. Существует много данных, поэтому я должен получить его по страницам. Кроме того, учитывая размер данных, мой сервер не может одновременно выполнять несколько вызовов/процессов, так как у меня закончилась нехватка памяти, и сервер аварийно завершает работу. Я не знаю до времени выполнения, сколько страниц мне нужно получить, чтобы получить все данные.

Я попытался выполнить цикл forEach с массивом количества страниц, однако это явно не работает. например:

pages = [1,2,3,4]; 
pages.forEach(function(pageNumber){ 
    veryMemoryExpensiveFunctionRetrievingAndProcessingPage(pageNumber).then(
// handle the results); 
}) 

(поведение здесь заключается в том, что все функции выполняются синхронно, а на сервере заканчивается память).

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

+0

Похоже, вам нужно работать над оптимизацией решения на стороне сервера вместо клиентской стороны. –

+0

Привет, извинения. Я должен был уточнить, что это приложение на стороне сервера node.js. Я извлекаю данные из внешней службы, меняя ее и вставляя в свою собственную БД. Я могу только восстановить его с разбивкой по страницам плюс мой собственный сервер, похоже, способен удерживать определенное количество страниц в памяти без сбоев. Поэтому я хочу принудительно выполнить последовательную обработку страниц на моей стороне сервера –

+0

@JDeane Прежде всего: http://www.codexpedia.com/javascript/increasing-the-memory-limit-in-node-js/ – Niezborala

ответ

1

Вам необходимо получить обещание для каждой страницы, если предыдущий завершается, а не все сразу. i.e

function fetchAndProcessPages(i, handlePage) { 
    retrievePage(pages[i]).then(page => { 
     handlePage(page); 
     if (i+1 < pages.length) fetchAndProcessPages(i+1, handlePage); 
    }); 
} 
fetchAndProcessPages(0, page => console.log(page)); 
+0

Это большое спасибо! Кажется очевидным сейчас, но я думаю, что это всегда так! –

Смежные вопросы