使while循环同步

eri*_*bae 24 javascript asynchronous node.js

我有一段代码

var page = 2;
var last_page = 100;
while(page <= last_page) {
  request("http://some_json_server.com/data?page=" + page, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      store_data(body)
    }
    page++;
  });                
}
Run Code Online (Sandbox Code Playgroud)

我做了以下,但它实际上没有检索任何东西.我这样做了吗?

var page = 2;
var last_page = 100;
while(page <= last_page) {
var async_arr = [];
async_arr.push(
  function(next) {
    request("http://some_api_url?page=" + page, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        store_data(body);
      }
    });
  }
);

async.series(
  async_arr, done
);
Run Code Online (Sandbox Code Playgroud)

kat*_*ugh 54

随着while你得到一个繁忙的循环,这在Node中是有目的的.

改为使其成为递归函数.每次通话都将在单独的时间内完成.

var page = 2;
var last_page = 100;

(function loop() {
    if (page <= last_page) {
        request("/data?page=" + page, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                store_data(body)
            }
            page++;
            loop();
        });
    }
}());
Run Code Online (Sandbox Code Playgroud)

  • 递归函数最终会耗尽你的所有内存,你将超过你的调用堆栈大小. (3认同)

And*_*ren 23

你正在寻找async.whilst().这个解决方案假设您实际上想要在另一个之后执行每个请求.正如@UpTheCreek提到的那样(编辑:我所提到的评论已被编辑),可能会异步进行并使用跟踪每个结果async.parallel.

var page = 2,
    lastPage = 100;

async.whilst(function () {
  return page <= lastPage;
},
function (next) {
  request("http://some_json_server.com/data?page=" + page, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      store_data(body)
    }
    page++;
    next();
  });
},
function (err) {
  // All things are done!
});
Run Code Online (Sandbox Code Playgroud)