Javascript Node.js-尝试在回调函数中嵌入回调函数
我有以下代码Javascript Node.js-尝试在回调函数中嵌入回调函数,javascript,node.js,callback,Javascript,Node.js,Callback,我有以下代码 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 (
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\u URL
中。它工作正常,没有问题。注意:我通过IDE直接在node REPL终端中运行此代码,以便调试它。执行上述操作后,我在终端键入item\u url
,并输出结果。如果你想知道我为什么用way做这个,这个变量稍后将在本文范围之外的另一个函数中使用。我这样做是因为这是将“request”的输出保存到变量的唯一方法(下面解释)
我有两个问题:
一个是我想把它全部封装到一个函数中,但无法让它工作。我希望它作为一个函数,因为我需要稍后从另一个函数调用此代码。下面是我如何改变它的:
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的函数中。当我调用这个函数test()
时,它执行与上面相同的操作,并将数据输出到item\u url
。我的问题是,我希望函数返回数据,而不是将其输出到该变量。当我在REPL中运行test()
时,它会显示undefined
。这是预期的,因为函数不返回任何内容。例如,当我运行var x=test()
时,我希望将输出存储在x中,但是当查看x时,它再次显示为未定义。我认为这个问题与我还没有完全理解的回调有关
第二个问题是,我希望函数中包含items\u 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;
}
我在函数中移动items\u url var声明,然后使用
return items\u 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);
});
你知道异步函数,return不起作用吗,你需要回调来从异步函数中获取数据。你能把它修复到回调吗?检查答案谢谢,这很有效。我认为问题在于我发现很难把握回调。它们的工作方式与正常功能相反,因此很难重新连接我的大脑。因此,与使用普通函数返回经典意义上的数据不同,您可以有效地将(返回的内容)数据推送到回调函数中,对吗?因为async fun不会立即返回数据,所以您需要等待回复
(返回的内容将立即返回)。
一旦获得数据,您可以通过调用回调来确认呼叫者。这就像调用那个函数一样。