首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS $q.resolve(),ES6 Promise.resolve() (和其他动物)

AngularJS $q.resolve(),ES6 Promise.resolve() (和其他动物)
EN

Stack Overflow用户
提问于 2015-12-30 01:24:12
回答 4查看 4.6K关注 0票数 3

免责声明:这里实际上问了两个问题,但我觉得它们是密切相关的。

我正在尝试将promise对象传递给指令,并且我想在promise解析后立即在指令中运行一些初始化代码。

在控制器中,我有:

代码语言:javascript
复制
$scope.item = $http.get(...)
    .success(function (result) {
        $scope.item = result.item;
});

$scope.item被传递给一个指令(通过一个名为item的独立作用域中的属性)。指令链接函数最终完成如下操作:

代码语言:javascript
复制
Promise.resolve(scope.item)
    .then(function () {
        initialize();
});

这在Firefox中工作得很好,但当我在IE上运行它时,我得到了一个错误,因为Promise没有定义。这个问题使我意识到,我可能需要使用AngularJS $q服务来提供浏览器之间的一致性,当我查看文档时,我发现了另一个问题,这个问题乍一看似乎很小,但它实际上让我头疼:success()函数已被弃用,我应该使用then(successCallback)。很简单,我想,但是一旦我改变了控制器中的success调用,代码在火狐中也就停止工作了!我想不出为什么。所以这是第一个问题。

第二个问题是(即使我将成功调用保留在控制器中),如果我修改指令链接函数中的代码以使用我认为等效的$q:

代码语言:javascript
复制
$q.resolve(scope.item, function() { initialize(); });

这仍然完全不起作用。有什么建议吗?

EN

回答 4

Stack Overflow用户

发布于 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调用放在服务中,不要直接影响作用域-然后调用这些服务来更新作用域。

模式基本上是:

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$http.get(...).then(function (result) {
  $scope.item = result.data;
});
票数 4
EN

Stack Overflow用户

发布于 2015-12-30 01:39:02

您关于.success方法被弃用的说法是正确的。.then方法与.success方法返回数据的方式不同。

代码语言:javascript
复制
$scope.httpPromise = $http.get(...)
    .then(function (result) {
        $scope.item = result.data.item;
        return result.data;
});

您需要将其中的数据 chain

代码语言:javascript
复制
$scope.httpPromise.then ( function (data) {
     //Do something with data
     initialize();
});

有关弃用.success方法的详细信息,请参阅AngularJS $http Service API Reference -- deprecation notice

票数 0
EN

Stack Overflow用户

发布于 2015-12-30 01:34:56

因为scope.item是一个承诺,所以你需要做的就是:

代码语言:javascript
复制
scope.item.resolve.then(function() { initialize(); });

确保在指令中注入了$q。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34515862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档