在我的应用程序中,我必须获取一些JSON数据并将其分配给数组,然后再加载页面。这是我使用CardService服务获取JSON的代码:
cards = [];
var cs = {
...
fetchCards: function() {
var d = $q.defer();
$http.get("data/cards.php").success(function(data) {
cards = data;
d.resolve();
}).error(function(data, status) {
d.reject(status);
});
return d.promise;
},
getCards: function() { return cards; };
...
}
在控制器的resolve块中,我具有以下内容:
WalletController.resolve = {
getCards: function(CardService) {
CardService.fetchCards().then(loadView, showError);
}
}
在实际的控制器中,我有以下内容:
function WalletController($scope, CardService) {
$scope.cards = CardService.getCards();
}
问题是,服务中的fetchCards函数似乎在将JSON数据分配给cards变量之前就解决了诺言。这导致我的视图中加载了空白数据,直到刷新两次并很幸运为止。
我可以确认延迟加载,因为当我在控制台中记录cards变量时,在第122行(当加载视图时)得到一个空数组,在第57行(当JSON调用成功时)得到一个完整的数组。视图加载
后 以某种方式执行第57行的代码。
我该如何解决?
我没有用过,resolve
但是我把它扔在那里,以防万一您遇到的问题与绑定到从服务返回的数组有关。
如果cards
要从服务返回数组并将其绑定到UI中,则可能需要尝试填充相同的数组而不是进行设置cards = data;
(这将使用未绑定到UI的新数组覆盖本地卡)。
就像是:
fetchCards: function() {
var d = $q.defer();
$http.get("data/cards.php").success(function(data) {
cards.length = 0;
for(var i = 0; i < data.length; i++){
cards.push(data[i]);
}
d.resolve();
}).error(function(data, status) {
d.reject(status);
});
return d.promise;
},
请参阅此提琴,以获取我要描述的工作示例。多次单击第一个按钮将更新视图,但是一旦单击第二个按钮,绑定将被破坏。
两者之间的主要区别是:
data.length = 0
和data.push()
保留原始数组的引用data
一个新的原始数组引用data = newArray
更新: 另外,就像下面提到的Mark
Rajcok一样,您可以使用angular.copy清空原始数组的引用,并从源代码中添加新的数组,从而保留原始数组的引用:
fetchCards: function() {
var d = $q.defer();
$http.get("data/cards.php").success(function(data) {
angular.copy(data, cards);
d.resolve();
}).error(function(data, status) {
d.reject(status);
});
return d.promise;
},
问题内容: 我正在尝试编写一个返回诺言的函数。但是有时候,所请求的信息会立即可用。我想将其包装在一个承诺中,这样消费者就不必做出决定了。 并像这样使用它: 问题在于,对于预解析的Promise不会执行回调。这是合法的事情吗?有没有更好的方法来处理这种情况? 问题答案: 简短的答案:是的,您可以 在返回AngularJS承诺之前将其解析,并且其行为将与您期望的一样。 来自JB Nizet的Plunk
问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您
问题内容: 我遇到了问题,我的指令只有在我的诺言得到解决后才能呈现其内容。我以为应该这样做,但是似乎没有用。 这是我的控制器: 我的指令: 范围返回还可以,当我在开发工具中检查它时并没有定义,但是我想这是因为到我检查它时,诺言已经解决了吗? 但是,返回undefined。 问题答案: 因为您的值是异步填充的,所以您需要添加一个监视函数来更新绑定的元素。 您还可以将很多复杂性转移到指令控制器中,并使
问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()
问题内容: 我有一个使用$ resource的简单控制器: 我在指令中使用此控制器(在链接功能中) 但是区域是不确定的。调用是异步的,这很逻辑。 我的问题是我该如何等待结果和区域成为包含所有数据的数组? 这里指令的定义 问题答案: 如果要使用异步方法,则需要通过$ promise使用回调函数,示例如下:
问题内容: 使用node.js版本7.7.2,我要执行一个异步函数,然后在第一个函数完成后执行另一个函数,如下所示: 问题是此安装程序打印“栏已被开除”,然后打印“foo将要解决”。我期望的是,bar将等待触发,直到foo返回的promise被解决为止。我是否误解了then()如何将回调在node.js事件循环中排队? 谢谢 问题答案: 如注释中所述,将一个函数传递给该函数,当该函数被调用时,将使