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