免责声明:这里实际上问了两个问题,但我觉得它们是密切相关的。
我正在尝试将promise对象传递给指令,并且我想在promise解析后立即在指令中运行一些初始化代码。
在控制器中,我有:
$scope.item = $http.get(...)
.success(function (result) {
$scope.item = result.item;
});$scope.item被传递给一个指令(通过一个名为item的独立作用域中的属性)。指令链接函数最终完成如下操作:
Promise.resolve(scope.item)
.then(function () {
initialize();
});这在Firefox中工作得很好,但当我在IE上运行它时,我得到了一个错误,因为Promise没有定义。这个问题使我意识到,我可能需要使用AngularJS $q服务来提供浏览器之间的一致性,当我查看文档时,我发现了另一个问题,这个问题乍一看似乎很小,但它实际上让我头疼:success()函数已被弃用,我应该使用then(successCallback)。很简单,我想,但是一旦我改变了控制器中的success调用,代码在火狐中也就停止工作了!我想不出为什么。所以这是第一个问题。
第二个问题是(即使我将成功调用保留在控制器中),如果我修改指令链接函数中的代码以使用我认为等效的$q:
$q.resolve(scope.item, function() { initialize(); });这仍然完全不起作用。有什么建议吗?
发布于 2015-12-30 01:40:04
您需要使用Angular的$q,不仅因为它可以跨浏览器工作,还因为它是deeply linked to Angular's digest cycles。其他的promise库can accomplish this feat,但原生promise不容易做到这一点。
$q.when所做的(Promise.resolve的$q版本)是将值或promise转换为$q promise。您不需要这样做,因为您已经在使用Angular自己的$http API,它已经返回了promises。
我强烈建议您将web调用放在服务中,不要直接影响作用域-然后调用这些服务来更新作用域。
模式基本上是:
$http.get(...) // no assign
.success(function (result) { // old API, deprecated
$scope.item = result.item; // this is fine
});或者使用has the benefits of promises over callbacks喜欢链接和错误处理的更好的then promise API:
$http.get(...).then(function (result) {
$scope.item = result.data;
});发布于 2015-12-30 01:39:02
您关于.success方法被弃用的说法是正确的。.then方法与.success方法返回数据的方式不同。
$scope.httpPromise = $http.get(...)
.then(function (result) {
$scope.item = result.data.item;
return result.data;
});您需要将其中的数据 chain。
$scope.httpPromise.then ( function (data) {
//Do something with data
initialize();
});有关弃用.success方法的详细信息,请参阅AngularJS $http Service API Reference -- deprecation notice。
发布于 2015-12-30 01:34:56
因为scope.item是一个承诺,所以你需要做的就是:
scope.item.resolve.then(function() { initialize(); });确保在指令中注入了$q。
https://stackoverflow.com/questions/34515862
复制相似问题