簡體   English   中英

Node.js - 試圖在回調 function 中嵌入回調 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM