inventoryData返回undefined,因为$ http.get是异步的,我该如何重构代码?

时间:2017-02-20 22:32:09

标签: javascript angularjs

我正在进行以下http get调用以获取html页面源代码,然后解析它。

出于某种原因,它会一直返回undefined。

我该如何解决?

  

更新:似乎$http.get()是异步的,那么我该如何从中返回一个值呢?

function checkInventory() {
  var newReqObj = DataService.getFormData();
  var store = newReqObj.store;
  var code = newReqObj.code;
  var size = newReqObj.size;

  if(store === 'nike') {
        var inventoryData = checkNike(store, code, size);
        $log.debug(inventoryData);
        return inventoryData;
    }
}

function checkNike(store, code, size) {
    var inventoryData = {
        'qtyAvailable': 0,
        'maxOrder': 0,
        'size': 0,
        'name': '',
        'price': '',
        'url': '',
        'code': code
    };

    var url = 'http://www.nike.co.uk/search?q=' + code;
    checkNikeUrl(url, size, inventoryData);
}

function checkNikeUrl(url, size, inventoryData) {
    $http.get(url).then(function(response) {
        var html = response.data;

        inventoryData.qtyAvailable = utility.getProductQty(html, size);
        inventoryData.maxOrder = utility.getProductMaxOrder(html, size);
        inventoryData.size = size;
        inventoryData.name = utility.getProductName(html);
        inventoryData.price = utility.getProductPrice(html);
        inventoryData.url = url;

        return inventoryData;
    })
};

2 个答案:

答案 0 :(得分:1)

你必须在你的代码中添加2个返回。

第一:

 $http.get(url).then(function(response) {

应该是

return $http.get(url).then(function(response) {

第二次

  checkNikeUrl(url, size, inventoryData);

应该是

return checkNikeUrl(url, size, inventoryData);

修改

我认为

var inventoryData = checkNike(store, code, size);

应该只是

return checkNike(store, code, size);

答案 1 :(得分:1)

您可以按如下方式重写代码:

function checkInventory() {
   var newReqObj = DataService.getFormData();
   var store = newReqObj.store;
   var code = newReqObj.code;
   var size = newReqObj.size;

     if(store === 'nike') {
        var deferred = $q.defer();
        checkNike(store, code, size).then(function(response){
            var inventoryData = response;
        $log.debug(inventoryData);

        deferred.resolve(inventoryData);
    });

    return deferred.promise;
    }
}

function checkNike(store, code, size) {
  var inventoryData = {
    'qtyAvailable': 0,
    'maxOrder': 0,
    'size': 0,
    'name': '',
    'price': '',
    'url': '',
    'code': code
  };

  var url = 'http://www.nike.co.uk/search?q=' + code;
  return checkNikeUrl(url, size, inventoryData);
}

function checkNikeUrl(url, size, inventoryData) {

    var deferred = $q.defer();

    $http.get(url).then(function(response) {
        var html = response.data;

        inventoryData.qtyAvailable = utility.getProductQty(html, size);
        inventoryData.maxOrder = utility.getProductMaxOrder(html, size);
        inventoryData.size = size;
        inventoryData.name = utility.getProductName(html);
        inventoryData.price = utility.getProductPrice(html);
        inventoryData.url = url;

        deferred.resolve(inventoryData);
    })

    return deferred.promise;
};

您可以使用此方法以及调用checkInventory()方法的方法,它们可以捕获承诺并处理返回的库存值。