Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-尝试在回调函数中嵌入回调函数_Javascript_Node.js_Callback - Fatal编程技术网

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不会立即返回数据,所以您需要等待回复
(返回的内容将立即返回)。
一旦获得数据,您可以通过调用回调来确认呼叫者。这就像调用那个函数一样。