Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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 inventoryData返回未定义,因为$http.get是异步的,如何重构代码?_Javascript_Angularjs - Fatal编程技术网

Javascript inventoryData返回未定义,因为$http.get是异步的,如何重构代码?

Javascript inventoryData返回未定义,因为$http.get是异步的,如何重构代码?,javascript,angularjs,Javascript,Angularjs,我正在进行以下HTTPGET调用,以获取html页面源代码,然后对其进行解析 出于某种原因,它总是返回未定义的 我怎样才能修好它 更新:似乎$http.get()是异步的,那么如何从中返回值呢 您必须在代码中添加2个返回 第一: $http.get(url).then(function(response) { 应该是 return $http.get(url).then(function(response) { 第二 checkNikeUrl(url, size, inventoryD

我正在进行以下HTTPGET调用,以获取html页面源代码,然后对其进行解析

出于某种原因,它总是返回未定义的

我怎样才能修好它

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


您必须在代码中添加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);

您必须在代码中添加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);

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

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()方法的任何方法,它们都可以捕获承诺并处理返回的库存值。

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

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()方法的任何方法,它们都可以捕获承诺并处理返回的库存值。

基本上,
$http.get()的可能重复是异步的;你不能仅仅从代码中返回一个值。如何重构代码,使其返回一个值。我正在运行一个进程,需要在按下提交按钮后返回所有数据。请阅读重复问题的答案…我看到您正在使用
然后
。如果您正在使用承诺,则可以返回承诺并使用promises@hlfrmn这意味着我必须重构代码才能使用
$q.defer()
对吗?但我不知道如何做到这一点……基本上,
$http.get()
的可能副本是异步的;你不能仅仅从代码中返回一个值。如何重构代码,使其返回一个值。我正在运行一个进程,需要在按下提交按钮后返回所有数据。请阅读重复问题的答案…我看到您正在使用
然后
。如果您正在使用承诺,则可以返回承诺并使用promises@hlfrmn这意味着我必须重构代码才能使用
$q.defer()
对吗?但我不知道该怎么做。。。