javascript - AngularJS V1.1 拦截器总是在末尾有 $q.when

标签 javascript angularjs return-value interceptor promise

documentation AngularJS(1.1版)关于拦截器,拦截器函数都是这样返回的

return response || $q.when(response);

但是,在我的应用程序中,始终定义“response”,因此永远不会执行 $q.when(response)。 所以问题是在什么情况下“响应”是未定义的,什么情况下会是

$q.when(response) // == $q.when(null)

做!因为响应未定义/为空?

最佳答案

  • $q.when(promise)promise
  • $q.when(nonPromise) → 一个新的 promise,它将异步解析为给定值 nonPromise

让我们看看什么是$q.when:

$q.when = function (foreignPromise) {
    var deferred = $q.defer();
    foreignPromise.then(function (data) {
        deferred.resolve(data);
        $rootScope.$digest();
    }, function (reason) {
        deferred.reject(reason);
        $rootScope.$digest();
    });
    return deferred.promise;
}

工厂返回 $q.when(data)

正如我们所见,$q.when 收到 promise 或 nonPromise 并将其包装起来。

工厂示例:

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return $q.when(data);
        }    
    }
    return factory;
}]); 

现在我们可以从 Controller 调用它了:

Data.query()
           .then(function (result) {
               $scope.data = result;                           
           }, function (result) {
               alert("Error: No data returned");
           });

演示 Fiddle

工厂返回 $q.when(data) ||数据

从这个例子我们返回 promise 。所以让我们稍微改变一下:

相反,return $q.when(data); 我们将这样写:

return $q.when(data) || data;

它也会起作用。但反之则不然。

据我所知,Angular 知道 Controller 等待 Data 服务 promise 和上述语句将使用 1st off $q.when(data)

演示 2 Fiddle

工厂返回数据|| $q.when(数据)

现在让我们通过这种方式调用我们的Data服务:

$scope.data =  Data.query();

没有 promise ,通话是同步的。

工厂看起来像:

fessmodule.factory('Data', ['$resource','$q',  function($resource, $q) {
    var data = [
        {
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000",
            "TotalSharesSold": "2.000000",
            "TotalMoneySharesSold": "18.000000",
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }
    ]; 

    var factory = {
        query: function (selectedSubject) {                             
            return  data || $q.when(data);
        }
    }
    return factory;
}]);

演示 3 Fiddle

我的结论

返回数据|| $q.when(data) 表示我们的服务可以返回单个值或 promise 。但是既然我们知道我们的服务返回什么类型的数据,那么这个声明就没有意义了。或 datapromise

关于javascript - AngularJS V1.1 拦截器总是在末尾有 $q.when,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770889/

相关文章:

javascript - 如何使用 "new"将对象变量添加到数组?

javascript:嵌套 for 循环内的 http 调用

c# - finally 之前的 return 语句

powershell - boolean 变量作为 Object[] 返回

javascript - 在 Chrome 中将对象记录到控制台的解决方法

javascript - 使用 Handlebars 查找助手访问数组和输出属性中的对象

javascript - 数据库插入前检查文本

javascript - 模态搜索过滤器不会清除 ng-repeat 列表,以前的结果仍然存在

javascript - AngularJS:从 ng-repeat 动态分配 Controller

visual-studio-2010 - Powershell:从其他PS脚本内部调用的Powershell脚本获取返回结果