【问题标题】:Getting the result of the promise returned by an asyncValidator获取 asyncValidator 返回的 promise 结果
【发布时间】:2015-04-13 17:08:42
【问题描述】:

角度文档中的 asyncValidator 示例如下所示:

ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {
  var value = modelValue || viewValue;

  // Lookup user by username
  return $http.get('/api/users/' + value).
     then(function resolved() {
       //username exists, this means validation fails
       return $q.reject('exists');
     }, function rejected() {
       //username does not exist, therefore this validation passes
       return true;
     });
};

如您所见,当返回一个被拒绝的承诺时,它传递了“存在”的值。这似乎意味着我可以在使用模型时访问这个值。这可能吗?

【问题讨论】:

    标签: angularjs angular-ngmodel


    【解决方案1】:

    我也想知道,因为我在这里没有找到答案,所以我看了一下源代码(对于 AngularJS 1.7.5):

    function processAsyncValidators() {
      var validatorPromises = [];
      /* … */
      forEach(that.$asyncValidators, function(validator, name) {
        var promise = validator(modelValue, viewValue);
        /* … */
        validatorPromises.push(promise.then(function() {
          /* … */
        }, function() {
          /* … */
        }));
      });
      /* … */
    }
    

    在这里,您可以看到 asyncValidator 返回的 Promise 与使用返回值的函数链接在一起。

    因此,很遗憾,无法访问返回的值。

    【讨论】:

      【解决方案2】:

      $http.get('/api/users/' + value) 看起来像一个普通的 ajax 请求。将第一个参数添加到成功回调可能会让您访问返回的数据 - 如果您的 api 确实返回任何数据。

      then(function resolved(response) {
        console.log(response);
        return $q.reject('exists');
      }
      

      【讨论】:

      • 对,我不知道如何获得任何旧承诺的结果,我试图从验证管道之外获得承诺的结果,这意味着我无权访问最初的承诺。
      猜你喜欢
      • 1970-01-01
      • 2021-07-23
      • 2015-07-15
      • 2017-06-02
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多