Node.js 检查异步函数是否有随机循环完成 我正在做一个简单的任务,从一个网站上获取一些数据,然后在另一个网站上进行检查,因此我成功地获取了数据,并创建了一个循环来检查数据的每个值,但问题是因为nodejs发送了所有请求,然后得到了响应。我做得很糟糕 索引的排列方式不正确,这意味着当我检查控制台中的I值时,有时会变为55,然后变为2,然后变为26,然后变为5-因此我无法检查循环是否由索引完成 检查条件变得随机,因此无法捕获是否已完成并将所有结果推送到数组中 每次条件为真时,它都会给我数组的结果,但我不想这样,我想在检查完所有内容后得到数组中的所有结果-我试图检查循环外的数组结果,但它只从数据中得到4或5,有时什么都不给我,因为所有请求已发送,循环已完成,我正在等待响应,因此无法找到检查是否已收到所有响应的正确方法
这是我的密码Node.js 检查异步函数是否有随机循环完成 我正在做一个简单的任务,从一个网站上获取一些数据,然后在另一个网站上进行检查,因此我成功地获取了数据,并创建了一个循环来检查数据的每个值,但问题是因为nodejs发送了所有请求,然后得到了响应。我做得很糟糕 索引的排列方式不正确,这意味着当我检查控制台中的I值时,有时会变为55,然后变为2,然后变为26,然后变为5-因此我无法检查循环是否由索引完成 检查条件变得随机,因此无法捕获是否已完成并将所有结果推送到数组中 每次条件为真时,它都会给我数组的结果,但我不想这样,我想在检查完所有内容后得到数组中的所有结果-我试图检查循环外的数组结果,但它只从数据中得到4或5,有时什么都不给我,因为所有请求已发送,循环已完成,我正在等待响应,因此无法找到检查是否已收到所有响应的正确方法,node.js,web-scraping,async-await,request,Node.js,Web Scraping,Async Await,Request,这是我的密码 consthttp=require(“http”); 常数r=要求(“请求”); const$=require(“jquery jsdom”); var-arr=[]; let data_list_req=函数(){ 返回新承诺((解决、拒绝)=>{ r({ //从这个url获取数据 url:“https://example.com/", 方法:“获取” },函数(err、resp、htm){ 解析(htm) }) }) } 数据列表请求()。然后((响应)=>{ 让tr=$($(
consthttp=require(“http”);
常数r=要求(“请求”);
const$=require(“jquery jsdom”);
var-arr=[];
let data_list_req=函数(){
返回新承诺((解决、拒绝)=>{
r({
//从这个url获取数据
url:“https://example.com/",
方法:“获取”
},函数(err、resp、htm){
解析(htm)
})
})
}
数据列表请求()。然后((响应)=>{
让tr=$($(response.find(“table”)[0]).html()).find(“tr”);
让data1_list=tr.find(“td:nth-child(2)”;
var data2_list=tr.find(“td:nth child(1)”;
for(设i=0,q=0;i{
r({
url:result_页面,
方法:“张贴”,
表格数据:{
“列表”:数据2_列表[i]。innerHTML+“:文本”
}
},函数(err、resp、htm){
解析(htm)
})
})
}
检查()。然后((响应)=>{
让代理检查=函数(){
返回新承诺((解决、拒绝)=>{
var code=$($(resp).find(“table”).html().find(“tr”)[1].getAttribute(“code”);
控制台日志(代码);
console.log(data2_list[i].innerHTML+“:text”)
//最后一步检查数据
r({
url:“http://example.com/checkdata.php?data=“+data2_列表[i]。innerHTML+”:“+data1_列表[q]。innerHTML+”&code=“+code,
方法:“获取”
},函数(err、resp、htm){
解决(htm);
})
})
}
代理检查()。然后((已检查)=>{
//资料
让first_data=$(选中)。查找(“td”)[“prevObject”][1]。innerHTML;
让第二个数据=$(选中)。查找(“td”)[“prevObject”][2]。innerHTML;
让我们检查_status=$(已检查)。查找(“td”)[“prevObject”][3]。innerHTML;
日志(第一个数据+“:”+第二个数据)
console.log(检查\u状态)
如果(检查_状态==“工作”){
arr.push(第一个数据+”:“+第二个数据)
控制台日志(arr)
}
})
})
}
}
})
您需要创建一个变量requests
,该变量维护代码已提交到事件循环的承诺计数,并且一旦承诺解决,您需要减少请求的计数。一旦计数变为零,您就可以解决承诺
比如说-
const http = require("http");
const r = require("request");
const $ = require("jquery-jsdom");
var arr = [];
let requests = 0;
let data_list_req = function() {
return new Promise((resolve, reject) => {
r({
//get the data from this url
url: "https://example.com/",
method: "GET"
}, function(err,resp,htm) {
resolve(htm)
})
})
}
const data = await new Promise(function (resolve, reject) {
data_list_req().then((response) => {
let tr = $($($(response).find("table")[0]).html()).find("tr");
let data1_list = tr.find("td:nth-child(2)");
var data2_list = tr.find("td:nth-child(1)");
for(let i = 0, q = 0; i < data2_list.length, q < data1_list.length; i++, q++) {
if (data1_list[q].innerHTML == "text") {
//second step get the data code
requests++;
let result_page = "http://example.com/code.php";
let check = function() {
return new Promise( (resolve, reject) => {
r({
url: result_page,
method: "POST",
formData: {
"list": data2_list[i].innerHTML+":text"
}
}, function(err,resp,htm) {
resolve(htm)
})
})
}
check().then((resp) => {
let proxy_check = function() {
return new Promise( (resolve, reject) => {
var code = $($(resp).find("table").html()).find("tr")[1].getAttribute("code");
console.log(code);
console.log(data2_list[i].innerHTML+":text")
//last step checking the data
r({
url: "http://example.com/checkdata.php?data="+data2_list[i].innerHTML+":"+data1_list[q].innerHTML+"&code="+code,
method: "GET"
}, function(err,resp,htm) {
resolve(htm);
})
})
}
proxy_check().then( (checked) => {
//data
requests--;
let first_data = $(checked).find("td")["prevObject"][1].innerHTML;
let second_data = $(checked).find("td")["prevObject"][2].innerHTML;
let check_status = $(checked).find("td")["prevObject"][3].innerHTML;
console.log(first_data+":"+second_data)
console.log(check_status)
if (check_status == "working") {
arr.push(first_data+":"+second_data)
console.log(arr)
}
if(requests === 0){
resolve(arr);
}
})
})
}
}
})
}
consthttp=require(“http”);
常数r=要求(“请求”);
const$=require(“jquery jsdom”);
var-arr=[];
让请求=0;
let data_list_req=函数(){
返回新承诺((解决、拒绝)=>{
r({
//从这个url获取数据
url:“https://example.com/",
方法:“获取”
},函数(err、resp、htm){
解析(htm)
})
})
}
常量数据=等待新承诺(函数(解析、拒绝){
数据列表请求()。然后((响应)=>{
让tr=$($(response.find(“table”)[0]).html()).find(“tr”);
让data1_list=tr.find(“td:nth-child(2)”;
var data2_list=tr.find(“td:nth child(1)”;
for(设i=0,q=0;i{
r({
url:result_页面,
方法:“张贴”,
表格数据:{
“列表”:数据2_列表[i]。innerHTML+“:文本”
}
},函数(err、resp、htm){
解析(htm)
})
})
}
检查()。然后((响应)=>{
让代理检查=函数(){
返回新承诺((解决、拒绝)=>{
变量代码=$($(分别)。
const http = require("http");
const r = require("request");
const $ = require("jquery-jsdom");
var arr = [];
let requests = 0;
let data_list_req = function() {
return new Promise((resolve, reject) => {
r({
//get the data from this url
url: "https://example.com/",
method: "GET"
}, function(err,resp,htm) {
resolve(htm)
})
})
}
const data = await new Promise(function (resolve, reject) {
data_list_req().then((response) => {
let tr = $($($(response).find("table")[0]).html()).find("tr");
let data1_list = tr.find("td:nth-child(2)");
var data2_list = tr.find("td:nth-child(1)");
for(let i = 0, q = 0; i < data2_list.length, q < data1_list.length; i++, q++) {
if (data1_list[q].innerHTML == "text") {
//second step get the data code
requests++;
let result_page = "http://example.com/code.php";
let check = function() {
return new Promise( (resolve, reject) => {
r({
url: result_page,
method: "POST",
formData: {
"list": data2_list[i].innerHTML+":text"
}
}, function(err,resp,htm) {
resolve(htm)
})
})
}
check().then((resp) => {
let proxy_check = function() {
return new Promise( (resolve, reject) => {
var code = $($(resp).find("table").html()).find("tr")[1].getAttribute("code");
console.log(code);
console.log(data2_list[i].innerHTML+":text")
//last step checking the data
r({
url: "http://example.com/checkdata.php?data="+data2_list[i].innerHTML+":"+data1_list[q].innerHTML+"&code="+code,
method: "GET"
}, function(err,resp,htm) {
resolve(htm);
})
})
}
proxy_check().then( (checked) => {
//data
requests--;
let first_data = $(checked).find("td")["prevObject"][1].innerHTML;
let second_data = $(checked).find("td")["prevObject"][2].innerHTML;
let check_status = $(checked).find("td")["prevObject"][3].innerHTML;
console.log(first_data+":"+second_data)
console.log(check_status)
if (check_status == "working") {
arr.push(first_data+":"+second_data)
console.log(arr)
}
if(requests === 0){
resolve(arr);
}
})
})
}
}
})
}