开发者问题收集

来自服务器的数据未定义:引用错误

2018-02-10
98

我有以下代码场景,我从服务器获取一些数据,并根据不同的会话条件显示数据,但它向我抛出一个 引用错误 ajProductDataFromServer 未在 showProduct 中定义

似乎 showProduct 没有对数据的引用,但我不知道差距在哪里,请帮助我!在 getAjax 中,我将 ajDataFromServer 传递给回调,在本例中为 getProductData 。那么 showProduct 是否也应该能够访问该数据?

// GLOBAL ARRAY for storing any DATA from the SERVER
var ajDataFromServer = [];

// Main ajax function using callback for getting data from the server
function getAjax(sUrl, callback) {
  var ajax = new XMLHttpRequest();
  ajax.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      ajDataFromServer = JSON.parse(this.responseText);
      callback(ajDataFromServer);
    }
  }

  ajax.open("GET", sUrl, true);
  ajax.send();

}

/************************************************************************/

// INITIALIZE / populate home page with products
document.addEventListener("load", function() {
  getAjax("api_get_products.php", getProductData);
});
getProductData();

/************************************************************************/
// GET ALL PRODUCTS and display them with diffrent features according role
function getProductData(ajProductDataFromServer) {

  if (sSessionRole === "admin") {
    //console.log( "PRODUCTS ARE EDITABLE" );
    showProductAdmin();

  } else if (sSessionRole === "user") {
    //console.log( "PRODUCTS ARE AVAILABLE FOR USER" );
    showProduct();

  } else {
    //console.log( "PRODUCTS AVAILABLE FOR PUBLIC" );
    showProduct();
  }
}

/************************************************************************/

// DISPLAY PRODUCTS for USER / PUBLIC dinamically using a loop and then INSERT into HTML
function showProduct() {
  lblProductList.innerHTML = "";

  for (var i = 0; i < ajProductDataFromServer.length; i++) {

    var lblProduct = '<div class ="lblProduct">' + '<a href="#' + ajProductDataFromServer[i].image + '">' + '<img src="' + ajProductDataFromServer[i].image + '" width="85%" class="lblProductImage" alt="product">' + '</a>' + '<a href="#_" class="lightbox" id="' + ajProductDataFromServer[i].image + '">' + '<img src="' + ajProductDataFromServer[i].image + '">' + '</a>' + '<h3 class ="lblProductName">' + ajProductDataFromServer[i].name + '</h3>' + '<h3 class ="lblProductPrice">' + 'Price:' + ' ' + ajProductDataFromServer[i].price + '<h3 class ="lblProductQuantity">' + 'Quantity:' + ' ' + ajProductDataFromServer[i].quantity + '</h3>' + '<button class="btnBuyProduct" data-productId="' + ajProductDataFromServer[i].id + '" >' + 'BUY PRODUCT' + '</button>' + '</div>';

    lblProductList.insertAdjacentHTML('beforeend', lblProduct);
  }

}
2个回答

有两个问题。

首先,您在 getAjax() 调用之外调用 getProductData(); ,因此它在 AJAX 完成之前运行。您还调用了没有参数的函数,因此 ajProductDataFromServer 将为 undefined 。我不确定您为什么会这样,它可能应该被删除。

其次, showProduct() 试图使用变量 ajProductDataFromServer ,但这是 getProductData() 中的局部变量。您需要将其作为参数传递:

function getProductData(ajProductDataFromServer) {

  if (sSessionRole === "admin") {
    //console.log( "PRODUCTS ARE EDITABLE" );
    showProductAdmin(ajProductDataFromServer);

  } else if (sSessionRole === "user") {
    //console.log( "PRODUCTS ARE AVAILABLE FOR USER" );
    showProduct(ajProductDataFromServer);

  } else {
    //console.log( "PRODUCTS AVAILABLE FOR PUBLIC" );
    showProduct(ajProductDataFromServer);
  }
}

function showProduct(ajProductDataFromServer) {
  lblProductList.innerHTML = "";

  for (var i = 0; i < ajProductDataFromServer.length; i++) {

    var lblProduct = '<div class ="lblProduct">' + '<a href="#' + ajProductDataFromServer[i].image + '">' + '<img src="' + ajProductDataFromServer[i].image + '" width="85%" class="lblProductImage" alt="product">' + '</a>' + '<a href="#_" class="lightbox" id="' + ajProductDataFromServer[i].image + '">' + '<img src="' + ajProductDataFromServer[i].image + '">' + '</a>' + '<h3 class ="lblProductName">' + ajProductDataFromServer[i].name + '</h3>' + '<h3 class ="lblProductPrice">' + 'Price:' + ' ' + ajProductDataFromServer[i].price + '<h3 class ="lblProductQuantity">' + 'Quantity:' + ' ' + ajProductDataFromServer[i].quantity + '</h3>' + '<button class="btnBuyProduct" data-productId="' + ajProductDataFromServer[i].id + '" >' + 'BUY PRODUCT' + '</button>' + '</div>';

    lblProductList.insertAdjacentHTML('beforeend', lblProduct);
  }

}
Barmar
2018-02-10

getProductData 中,您将一个名为 ajProductDataFromServer 的变量声明为参数名称。

这使它成为 getProductData 函数范围内的局部变量。

您从未在该函数内使用该变量。

同时:

showProduct 中,您尝试(多次)从名为 ajProductDataFromServer 的变量读取数据,但您尚未声明该变量。

唯一的 ajProductDataFromServer 变量存在于不同的函数中。

showProduct 将无法访问 getProductData 变量,因为对 showProduct 的调用是在 getProductData 内部进行的。

您需要明确传递数据。


顺便说一句, getProductData 被调用两次。一次作为对 Ajax 的回调,一次在您添加事件侦听器后立即调用。

getProductData(); 调用它时不使用任何参数,因此时间 ajProductDataFromServer 无论如何都将是 undefined

Quentin
2018-02-10