【问题标题】:Angular JS: Cannot read property 'then' of undefinedAngular JS:无法读取未定义的属性“then”
【发布时间】:2016-11-03 19:48:59
【问题描述】:

我不确定我在这里做错了什么 -

function clearBefore(val) {
                if (val.isEnrolled && val.name === 'XYZ') {
                    vm.clear(val, 'Hello').then(function(value){
                        return value;
                    });
                    return true;
                }
            }

然后调用它-

clearBefore(val).then(function (returnVal) {});

我是 Promise 的新手,请告诉我应该如何更新函数以返回 Promise。

【问题讨论】:

  • vm.clear(val, 'Hello').then(function(value) vm 是什么?
  • vm.clear 是否返回承诺?
  • 不,它不返回任何承诺
  • 因此您不能使用vm.clear(...).then(...) 和/或直接使用return vm.clear(...)。我会更新我的答案。

标签: javascript angularjs promise


【解决方案1】:

在“if”内部返回“true”,在“if”外部不返回任何内容,因此不能将 clearBefore() 的返回用作承诺。

也许这就是你想要的:

function clearBefore(val) {
  if (val.isEnrolled && val.name === 'XYZ') {   
    return $q.resolve(vm.clear(val, 'Hello'));
  }

  return $q.reject();
}

clearBefore(val).then(
  function(val) {
    console.log('ok', val);
  },
  function() {
    console.log('not ok...');
  }
);

现在函数的每个返回点都返回一个promise。我们在“if”中有一个$q.resolve(),在外面有一个$q.reject(),用于返回一个失败的promise。

【讨论】:

    【解决方案2】:

    你需要兑现你的承诺

    function clearBefore(val){
         if (val.isEnrolled && val.name === 'XYZ')
         {   
             return vm.clear(val, 'Hello').then(function(value)
             { 
                  return value; 
             }); 
             return true; 
          } 
    }
    

    类似的东西

    【讨论】:

      【解决方案3】:

      好像你在 clearBefore() 函数的末尾没有返回任何东西,所以尝试这样做:

      function clearBefore(val) {
                      if (val.isEnrolled && val.name === 'XYZ') {
                          vm.clear(val, 'Hello').then(function(value){
                              return value;
                          });
                      }
                    return val; // here you should return what you need
                  }
      

      然后:

      clearBefore(val).then(function (returnVal) {});
      

      【讨论】:

        【解决方案4】:

        为了解决这个问题,我做了如下的事情(向函数引入了承诺)

        function clearOTPBefore(page) {
                        return $q(function (resolve, reject) {
                            if (val.isEnrolled && val.name === 'XYZ') {
                                return vm.clear(val, 'Hello').then(function(value){
                                    return resolve(value);
                                });
                            } else {
                                resolve(true);
                            }
        
                        })
                    }
        

        【讨论】:

          猜你喜欢
          • 2015-09-08
          • 1970-01-01
          • 2014-11-29
          • 2016-01-12
          • 2017-04-21
          • 2018-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多