0

我对 JS 很陌生,对 Node 也很陌生。我正在尝试制作一个非常简单的应用程序,从 edamam API ( https://rapidapi.com/edamam/api/edamam-nutrition-analysis ) 中提取 JSON 数据。我已经让 API 正常工作,现在我想使用请求返回的数据,但它被困在回调函数中,我无法弄清楚如何在检索它的函数之外访问它。

据我所知,这与 Node 的异步特性有关。我已经尝试以我能想到的各种方式重新排序(超过 6 个小时!),但我得到的只是未定义的变量。我想那是因为它们尚未设置,但我对回调函数的处理还不够,无法理解如何解决这个问题。

最终我希望能够使用 JSON 数据来更新 HTML 元素的内容。

   const unirest = require('unirest');


   var getNutritionInfo = {
        mkString: function(foodStr){
          var ingredients = new Array();
          ingredients.push(foodStr);
          console.log(foodStr)
              params = {
              ingr: ingredients,

          };

          esc = encodeURIComponent;
          query = Object.keys(params)
              .map(k => esc(k) + '=' + esc(params[k]))
              .join('&');

          foodQuery = query.replace(/%20/g,"+");
          return(foodQuery);
        },

        analyse: function(foodStr){
          var cals;
          url = "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data"
          searchQuery = getNutritionInfo.mkString(foodStr);
          function requestData(callback){
              unirest.get(url+"?" + searchQuery)
              .header("X-RapidAPI-Key", "c5c219c7b0mshbf5b602f68caddep1cd8cfjsn01a1be1f45a4")
              .end(function (result) {
                cals = result.body.totalNutrients.ENERC_KCAL.quantity;
                console.log(cals + " first");
                callback();

            });
          }
          requestData(function(){
            console.log(cals + " second");

                getNutritionInfo.getData();


          });
        },

        getData: function(){
          var calories = getNutritionInfo.analyse.cals;
          console.log(calories + " third");
          return calories;
        }
};

最终的 console.log 始终未定义,而我希望它返回 cals 行的值(result.body.totalNutrients.ENERC_KCAL.quantity);

另外,我非常抱歉。我知道必须有更简洁的方法来组织函数和格式化代码。我最终会到达那里:)

4

1 回答 1

0

最终的 console.log 始终未定义,而我希望它返回 cals 行的值(result.body.totalNutrients.ENERC_KCAL.quantity);

这是因为 nodejs 的异步特性。要从中获取值requestData(),您需要将cal值作为值传递给回调。

做出这些改变,

'use strict';

const unirest = require('unirest');

var getNutritionInfo = {
  mkString: function (foodStr) {
    var ingredients = new Array();
    ingredients.push(foodStr);
    console.log(foodStr)
    params = {
      ingr: ingredients,

    };

    esc = encodeURIComponent;
    query = Object.keys(params)
      .map(k => esc(k) + '=' + esc(params[k]))
      .join('&');

    foodQuery = query.replace(/%20/g, "+");
    return (foodQuery);
  },

  analyse: function (foodStr) {
    url = "https://edamam-edamam-nutrition-analysis.p.rapidapi.com/api/nutrition-data"
    searchQuery = getNutritionInfo.mkString(foodStr);
    function requestData(callback) {
      unirest.get(url + "?" + searchQuery)
        .header("X-RapidAPI-Key", "c5c219c7b0mshbf5b602f68caddep1cd8cfjsn01a1be1f45a4")
        .end(function (result) {
          let cals = result.body.totalNutrients.ENERC_KCAL.quantity;
          console.log(cals + " first");
          callback(cals); // pass value here
        });
    }
    requestData(function (cals) { // get value after completion
      console.log(cals + " second");
      getNutritionInfo.getData();
    });
  },

  getData: function () {
    var calories = getNutritionInfo.analyse.cals;
    console.log(calories + " third");
    return calories;
  }
};
于 2018-12-31T10:39:45.550 回答