var https = require("https");
const arr = [];
for (let i = 1; i < 26; i ) {
https.get(
`https://jsonmock.hackerrank.com/api/countries?page=${i}`,
(res) => {
res.on("data", (data) => {
JSON.parse(data).data.map((info, i) => {
let { name } = info;
arr.push(name);
console.log(name);
});
});
}
);
}
console.log(arr);
當我只是記錄 JSON.parse(data) 我在我的控制臺上獲取所需的資料
但是當我試圖將它推入一個陣列時,它并沒有發生,而是將一個空陣列記錄到控制臺上
真的需要知道原因,因為我現在堅持了 3 天
uj5u.com熱心網友回復:
您的問題是回呼https.get
- 即被異步(res) =>
呼叫- 因此,甚至在發出25 個請求之前執行- 如果你在哪里,你會看到它確實有效- 所以你假設你無法推送是不正確的console.log(arr);
https.get
arr.push
console.log(arr);
console.log(name);
您正在推送到陣列,當陣列中有資料時,您永遠不會 console.log 陣列
我想我可以建議使用您正在使用的相當舊版本的 Node.js (14.16.0) 執行此操作的一種方法如下
var https = require("https");
function fn(callback) {
const result = [];
let done = 0;
for (let i = 1; i < 26; i ) {
https.get(`https://jsonmock.hackerrank.com/api/countries?page=${i}`, (res) => {
res.on("data", (data) => {
JSON.parse(data).data.map((info) => {
let { name } = info;
result.push(name);
console.log(name);
});
// keep track of how many requests have "completed"
done = done 1;
// when all are done, call the callback
if (done === 25) {
callback(result);
}
});
});
}
}
fn(arr => { // here is where arr is populated, nowhere else
console.log(arr);
});
請注意,arr
只能在回呼內部訪問 - 您將無法arr
像您想要的那樣在頂級訪問 - 您唯一可能的方法是使用支持頂級的 Node.js 版本await
- 并轉換要使用的代碼Promise
(這是一項微不足道的任務)
不確定它是否重要,但不能保證其中的名稱arr
順序正確......例如,迭代 3 的結果可能會在迭代 4 之后推送,因為這是網路請求的性質,所以不能保證他們什么時候完成
作為旁白。如果您要使用最新(撰寫本文時為 18.1)版本的 node.js - 上面可以寫成
const promises = Array.from({length:25}, async (_, i) => {
const res = await fetch(`https://jsonmock.hackerrank.com/api/countries?page=${i 1}`);
const data = await res.json();
return data.map(({name}) => name);
});
const arr = (await Promise.all(promises)).flat(2);
console.log(arr);
值得注意的事情是
- native
fetch
- 與常規 node.js 方法相比,這使得網路請求更簡單 - 頂級
await
- 因此,您可以arr
在代碼的頂級使用 - 6 行代碼 vs 20 多行代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/476030.html
標籤:javascript 节点.js api https 得到