2016-01-21 104 views
1

我有一个成功的回调设置从服务返回的值,但是当我引用值是一个承诺,而不是像我期望的简单类型(布尔)。下面的代码的基本结构:承诺解决方案通过承诺,而不是价值

var ZService = $resource('api/w/:id/zs'); // returns a list of Zs 
var XService = $resource('api/x/:id/hasAttribute'); // returns a boolean value 
$scope.zList = ZService.query({id:$scope.w.id}); 
$scope.zList.$promise.then(function(zs) { 
    for(var i=0; i<zs.length; i++) { 
     (function(i) { 
      var z = zs[i]; 
      XService.get({id:z.x.id}).$promise.then(function(has) { 
       console.log("has: " + has); 
       z.attr = has; 
      }); 
     })(i); 
    } 
} 

在我看来,我使用<span ng-show="z.attr == true">(内z in zList中继器)和量程永远不会显示。如果我将has的值记录到控制台,它表明它是一个承诺,而不是我所期望的布尔值。同样,如果我在调试器中检查z.attr的值,则它是一个对象(已解决的承诺)。

我在我的代码中的其他地方使用了promise,并没有出现问题,但大多数时候我已将返回值分配给$scope内的变量,所以我想知道是否有某种类型的的魔法在幕后进行。在其他地方,我返回的是复合对象而不是简单的值,所以我也想知道这是否与它有关。

+0

看起来这只是代码的一部分。第二个'then()'后面还有至少一个括号缺失。为什么你需要立即调用的函数?你可以在上下文中发布代码吗?什么是从服务器(字面意思)返回?你在哪里输出值到控制台? – lex82

+0

是的,实际的代码是大约五十行,并有一堆无关的东西,我试图削减它,并泛化它更清楚地解释结构。我需要IIFE,否则它会在循环中创建一个闭包,我只会得到列表中最后一个元素的结果。我编辑了示例以显示日志记录完成的位置。 – TMN

+0

如果这是真正的代码,这意味着'XService'使用承诺的自定义,有缺陷的实现。 –

回答

1

问题是$resource需要一个对象或一个对象数组。它不适用于原始值。当它检索一个对象时,它添加了便利的方法,如$save,否则就不可能。

有关详细信息,请参阅this answer到相关问题。