Вы должны использовать item_urls
ВНУТРИ обратного вызова, в котором вы впервые получаете его значение. Единственный способ использовать это значение - использовать его прямо в самом обратном вызове или в функции, которую вы вызываете оттуда, и передать ему значение.
Проблема в том, что request()
является асинхронным и не блокировки. Это означает, что вы выполняете request()
, он запускает операцию, а затем возвращается и переходит к выполнению большего количества кода (включая код, в котором вы пытаетесь использовать item_urls
). Но в этот момент обратный вызов еще не был вызван, поэтому он все еще undefined
.
В конце, ЕДИНСТВЕННОЕ место, которое, как вы знаете, имеет значение item_urls
, находится внутри этого обратного вызова. Таким образом, любой код, который использует это значение, должен go внутри этого обратного вызова или вызываться из этого обратного вызова. Вот как работает асинхронное программирование в node.js.
Итак, оно должно выглядеть следующим образом:
function getitems(){
request(url, options, (error, res, body) => {
if (error) {
return console.log(error)
}
if (!error && res.statusCode == 200) {
console.log(body);
// use body.payload.items directly here
// or call some function here and pass it the value
// Do not assign it to some higher scoped variable and
// expect to use it elsewhere. Can't do that.
}
});
}
getitems()
Если вы хотите получить значение вне getitems, тогда вам нужно используйте или обратный вызов, и событие, или обещание для передачи асинхронного полученного значения за пределы getitems()
. Вы можете увидеть полное обсуждение того, почему вы не можете просто вернуть значение из getitems()
здесь в этом очень популярном ответе: Как я могу вернуть ответ от асинхронного вызова .
Я не знаю, что вы думаете, не работает со вторым блоком кода, где код находится в функции. Я просто поместил это в файл сам по себе и выполнил, и он работает просто отлично. Итак, если вы удалите item_urls
из уравнения и используете результат внутри обратного вызова, как я предлагал выше, все это прекрасно работает, даже во втором блоке кода.
Вот точная программа, которую я только что выполнил :
const request = require('request');
let url = "https://api.warframe.market/v1/items";
let options = {
json: true
};
function getitems() {
request(url, options, (error, res, body) => {
if (error) {
return console.log(error);
}
if (res.statusCode === 200) {
console.log(body.payload.items);
}
});
}
getitems()
Этот код работает. Это дает мне вывод, как это:
[
{
id: '5835a4564b0377e226bdc360',
url_name: 'axi_c1_intact',
thumb: 'icons/en/thumbs/Axi_C1_Intact.99413ebefc5b87d57d9e5314265b56de.128x128.png',
item_name: 'Axi C1 Intact'
},
{
id: '5835a4dd4b0377e226bdc380',
url_name: 'meso_s3_intact',
thumb: 'icons/en/thumbs/Meso_S3_Intact.caee59471a7b06ca040f2d257083e008.128x128.png',
item_name: 'Meso S3 Intact'
},
{
id: '58d8f31c11efe42a5e523215',
url_name: 'lith_n2_exceptional',
thumb: 'icons/en/thumbs/Lith_N2_Exceptional.b82a140ba17908be7226fddcecd7bf62.128x128.png',
item_name: 'Lith N2 Exceptional'
},
{
id: '5936dd6916efa3a742b15f48',
url_name: 'lith_n3_exceptional',
thumb: 'icons/en/thumbs/Lith_N3_Exceptional.b82a140ba17908be7226fddcecd7bf62.128x128.png',
item_name: 'Lith N3 Exceptional'
},
{
id: '5835a4404b0377e226bdc358',
url_name: 'neo_v4_intact',
thumb: 'icons/en/thumbs/Neo_V4_Intact.e0e38afae723757487927845b35a81d2.128x128.png',
item_name: 'Neo V4 Intact'
},
.... a whole bunch more items