wake-up-neo.com

Die while-Schleife synchron machen

Ich habe einen folgenden Code

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++;
  });                
}

Ich habe folgendes getan, aber es wird tatsächlich nichts abgerufen. Mache ich das richtig?

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
);
23
ericbae

Sie suchen nach async.whilst () . Bei dieser Lösung wird davon ausgegangen, dass Sie tatsächlich jede Anforderung nach der anderen ausführen möchten. Wie @UpTheCreek erwähnt (edit: Der Kommentar, auf den ich mich bezogen habe, wurde bearbeitet), wäre es wahrscheinlich möglich, dies asynchron durchzuführen und jedes Ergebnis mithilfe von async.parallel zu verfolgen.

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!
});
22

Mit while erhalten Sie eine ausgelastete Schleife, die in Node einem bestimmten Zweck dient.

Machen Sie stattdessen eine rekursive Funktion. Jeder Anruf wird in einem separaten Häkchen durchgeführt.

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();
        });
    }
}());
54
katspaugh

Sie können Ihre While-Schleife auch asynchron einwickeln und brechen, nachdem Ihr Versprechen gelöst wurde/Bedingungen erfüllt wurden ...

    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)
  })()
0
seanbehan