Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使while循环同步_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 使while循环同步

Javascript 使while循环同步,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有下面一段代码 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)

我有下面一段代码

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++;
  });                
}
var-page=2;
var last_page=100;
当(第页)您正在查找时。此解决方案假设您确实希望一个接一个地执行每个请求。正如@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!
});
var page=2,
最后一页=100;
async.while(函数(){

使用
返回页面,而
会得到一个忙循环,这是节点中的反作用

将其改为递归函数。每个调用都将在单独的记号中完成

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();
        });
    }
}());
var-page=2;
var last_page=100;
(函数循环(){

如果(第页),您还可以异步包装您的while循环,并在承诺解析/条件满足后中断

    const request = require("request")

    ;(async()=>{

    let results = []
    while(true){
      await new Promise(resolve => {
        request('http://www.seanbehan.com/', (err, resp, body)=>{
          console.log(new Date, 'Downloading..')
          results.push(body)
          resolve(body)
        })
      })

      if(results.length >= 5){
        break
      }
    }

    console.log(results)
  })()

关于编辑,您必须调用next()在请求回拨中该死,我希望你回答了我刚才问的问题。我想这正是我要找的。+1如果你不知道页数怎么办?你会怎么处理@katspaugh@TheGrayFox,响应应该以某种方式指示页数,或者只是不向您发送数据,这样您就知道不应该关闭下一个请求。递归函数最终将耗尽您所有的内存,您将超过您的调用堆栈大小。@katspaugh假设用例从未超过第100页,它可能不会导致任何问题,并且它的递归只发生在请求回调内部,它可能不会导致问题。如果您计划使用此模式。我认为您应该研究使用http代理。我发现,通过将代理用作自定义请求池,您可以更好地控制大量http请求。
    const request = require("request")

    ;(async()=>{

    let results = []
    while(true){
      await new Promise(resolve => {
        request('http://www.seanbehan.com/', (err, resp, body)=>{
          console.log(new Date, 'Downloading..')
          results.push(body)
          resolve(body)
        })
      })

      if(results.length >= 5){
        break
      }
    }

    console.log(results)
  })()