[英]Node.js - Trying to embed callback function inside a callback function
我有以下代碼
const request = require('request');
var url = "https://api.warframe.market/v1/items";
var options = {
json: true
};
var item_urls;
request(url, options, (error, res, body) => {
if (error) {
return console.log(error)
};
if (!error && res.statusCode == 200) {
item_urls = body.payload.items;
console.log("done");
};
});
它檢索 JSON 文件,對其進行解析,然后將其保存到items_urls
中。 它工作正常,沒有問題。 注意:我通過 IDE 直接在節點 REPL 終端中運行此代碼,以便調試它。 執行上述操作后,我在終端輸入item_urls
並輸出結果。 如果您想知道為什么我這樣做了,這個變量稍后將在本文的 scope 之外的另一個 function 中使用。 我這樣做是因為這是我可以將 output 從“請求”保存到變量的唯一方法(接下來解釋)。
我有兩個問題:
一個是我想把它全部封裝到一個 function 並且不能讓它工作。 我想要它作為 function 因為我需要稍后從另一個 function 調用此代碼。 這是我如何改變它:
const request = require('request');
var url = "https://api.warframe.market/v1/items";
var options = {
json: true
};
var item_urls;
function test() {
request(url, options, (error, res, body) => {
if (error) {
return console.log(error)
};
if (!error && res.statusCode == 200) {
item_urls = body.payload.items;
console.log("done");
};
});
}
如您所見,我只將代碼的“請求”部分包裝在名為 test 的 function 中。 當我調用這個 function test()
時,它的作用與上面相同,並將數據輸出到item_urls
。 我遇到的問題是我希望 function返回數據,而不是 output 將其返回到該變量。 當我在 REPL 中運行test()
時,它顯示undefined
。 這是意料之中的,因為 function 不返回任何內容。 例如,我想在運行var x = test()
時將 output 存儲在 x 中,但在查看 x 時再次顯示未定義。 我認為這個問題與我尚未完全掌握的回調有關。
第二個問題是我想要items_url
中的 items_url,因為有人告訴我這樣做是最佳做法。
這是我嘗試返回數據的最終代碼:
const request = require('request');
var url = "https://api.warframe.market/v1/items";
var options = {
json: true
};
function test() {
var item_urls;
request(url, options, (error, res, body) => {
if (error) {
return console.log(error)
};
if (!error && res.statusCode == 200) {
item_urls = body.payload.items;
console.log("done");
};
});
return item_urls;
}
我在 function 中移動 items_url var 聲明,然后使用return items_url
將其返回。 如果我再次運行x = test()
它仍然顯示未定義。 我曾嘗試將 return 語句移動到不同的代碼塊,但它永遠不會起作用。 我究竟做錯了什么? 我需要它來返回數據。
有很多方法可以解決這個問題。 更好地理解異步編程。
const request = require("request");
var url = "https://api.warframe.market/v1/items";
var options = {
json: true,
};
function test() {
var item_urls;
request(url, options, (error, res, body) => {
if (error) {
return console.log(error);
}
if (!error && res.statusCode == 200) {
item_urls = body.payload.items;
console.log("done");
}
});
// return item_urls; // WIll return, before even getting data
}
// SOL 1
// USING CALLBACK
function test(cb) {
request(url, options, (error, res, body) => {
if (!error && res.statusCode == 200) {
cb(body.payload.items);
}
});
}
test((urls) => {
console.log(urls);
});
// SOL 2
// USING PROMISE
function test() {
return new Promise((r, rr) => {
request(url, options, (error, res, body) => {
if (error) {
return rr(error);
}
if (!error && res.statusCode == 200) {
return r(body.payload.items);
}
});
});
}
test().then((urls) => {
console.log(urls);
});
const {promisify} = require("util")
const pr = promisify(request)
// SOL 3
// USING ASYNC- AWAIT
async function test() {
const res = await pr(url, options)
return res.body.payload.items
}
test().then((urls) => {
console.log(urls);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.