5

Я использую aync.parallel для параллельной работы двух функций. Функции запрашивают RSS-каналы. Затем RSS-каналы анализируются и добавляются на мою веб-страницу.Node.JS async.parallel не дожидался завершения всех заданий

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

The documentation says:

После того, как задачи завершения, результаты передаются к конечному обратного вызова в виде массива ,

Мой код.

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts); // Needs time to request and parse 
     callback(); 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

На самом деле я только "Готово!" на моей веб-странице. Зачем?

Зачем мне нужно звонить res.end()?

The Node.JS documentation говорит:

Метод response.end(), должен быть вызван на каждом ответе.

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

ответ

9

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

function fetchRss(res, bbcOpts, callback) { 
    doSomething(); 
    callback(); 
} 

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts, callback); // Needs time to request and parse 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

На стороне записки, вы должны вызвать res.end() для того, чтобы узел знать, что сообщение является полным и что все (заголовки + тело) было написано. В противном случае сокет останется открытым и будет ждать навсегда другого сообщения (поэтому браузер показывает индикатор выполнения: он не знает, что запрос закончился).

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