Nodejs: Как написать высокопроизводительный асинхронный цикл - PullRequest
0 голосов
/ 20 мая 2011
У

есть initUrl, это статья, которая содержит следующий блог, и определение function getNextUrl(url, callback(err, nextUrl)), хотите получить следующий сотый URL.

В stormjs (развивающийся https://github.com/guileen/stormjs/issues/1), пишется как

var url = initUrl;
for(var i=0; i<100; i++){
  url = getNextUrl(url, _);
}
console.log(url);

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

1 Ответ

3 голосов
/ 20 мая 2011
arr = [];
(function recurse(url, i) {
    getNextUrl(url, function(err, nextUrl) {
        if (!err) {
            arr.push(nextUrl);
            if (i < 100) recurse(nextUrl, i++);
        }
    });
}("", 0);

Я называю этот шаблон загрузочной рекурсией.

Если вы предпочитаете, чтобы оно было более кратким, а не эффективным, вы можете использовать .bind магию.

(function recurse(i, err, url) {
    if (!err) arr.push(url);

    if (i < 100) getNextUrl(url, recurse.bind(null, ++i));
}(0, "trick it", url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...