javascript - 返回嵌套 Promise 时无法读取未定义的属性 'then'

标签 javascript angularjs

我不断收到以下错误:类型错误:无法读取 checkInventoryData 中未定义的属性“then”。我该如何解决?

function checkInventoryData(url, size, code) {
  var inventoryData = { };

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

    // getting error here: TypeError: Cannot read property 'then' of undefined
    getInventoryProductQty(html, size).then(function(result) {
        result = inventoryData.productQty;
    });

    return inventoryData;
  });
}

function getInventoryProductQty(html, size) {
  var inventoryAvailable;
  var deferred = $q.defer();
  try {
    var inventoryAvailablity = getInventoryAvailability(html, size);
    inventoryAvailablity.then(function(result) {
      if(result) {
        inventoryAvailable = result.getAttribute('data-available');
        deferred.resolve(inventoryAvailable);
        return deferred.promise;
      }
    });
  }
  catch(err) {
    inventoryAvailable = null;
    return inventoryAvailable;
  }
}

最佳答案

您需要从 getInventoryProductQty 返回一个 Promise,现在您在错误情况下返回 null,但在正常情况下则不会返回任何内容(这两个都不是 Promise。

编辑 - 在OP代码中显示这个答案,并对结构进行评论。

function checkInventoryData(url, size, code) {
  var inventoryData = { };

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

    // getting error here: TypeError: Cannot read property 'then' of undefined
    getInventoryProductQty(html, size).then(function(result) {
        result = inventoryData.productQty; // this has not been set at this point, you need to set it somehow (@trincot's comment)
    });

    return inventoryData;
  });
}

function getInventoryProductQty(html, size) {
  var inventoryAvailable;
  var deferred = $q.defer();
  try {
    var inventoryAvailablity = getInventoryAvailability(html, size);
    return inventoryAvailablity.then(function(result) { // need to add this return to return the result of the then func
      if(result) {
        inventoryAvailable = result.getAttribute('data-available');
        deferred.resolve(inventoryAvailable);
        return deferred.promise;
      }
    });
  }
  catch(err) {
    //inventoryAvailable = null;
    //return inventoryAvailable;
    return $q.resolve(null); // need something like this to return a promise from the failure case
  }
}

您还应该让 getInventoryAvailability 返回一个 Promise,以便可以使用 .catch 而不是 try...catch 来调用它,但这超出了本文的范围

关于javascript - 返回嵌套 Promise 时无法读取未定义的属性 'then',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473635/

相关文章:

iis-7 - 为 AngularJS HTML5Mode 配置 IIS URL 重写模块仍然无法正常工作

javascript - JsTree 拖放 - 移动时图标不显示

angularjs - 在 AngularJS 中,如何防止子 Controller 继承父 Controller 的作用域?

javascript - 将 axios 响应传递给 React 中的子组件

javascript - ng-repeat:在点击时显示一个项目并隐藏其他项目

javascript - Promises polyfill 是否在 Google Closure Compiler 20161024 中包含 all()?

javascript - HTML 富文本编辑器与 justify* 命令相关的问题

javascript - 如何将单击时的图像源更改为一个源,并在同一单击时返回到不同的源

javascript - ANGULARJS 用空数组填充数组对象

java - 如何在java selenium中xpath这个 "Policy"选项卡