【问题标题】:Angulajs wait till REST API returns dataAngularjs 等到 REST API 返回数据
【发布时间】:2014-12-26 13:10:10
【问题描述】:

我正在使用不返回承诺的 Trello API。它有回调函数。我想给它写一个包装器,它会等到回调被执行并返回数据。 我写了下面的代码:

 function getLoggedInMember() {
    var deferred = $q.defer();
    Trello.members.get("me", deferred.resolve);
    deferred.promise.then(function (user) {
        return user;
    });
}

此功能在我的会员服务中。下面是我的路由配置:

angular.module('trelloDashboard').config(['$routeProvider', function ($routeProvider) {
$routeProvider
 .when('/', {
     templateUrl: 'Views/Login.html',
     controller: 'LoginController'
 })
 .when('/Dashboard', {
     templateUrl: 'Views/Dashboard.html',
     controller: 'DashboardController',
     resolve: {
         user: function (MemberService) {
             return MemberService.getLoggedInMember();                 
         }
     }
 });}]);

这显然行不通。有没有办法实现我在这里尝试做的事情? 谢谢。

【问题讨论】:

  • 是的,问题是你没有从函数中返回任何东西。你需要在你的函数中return deferred;
  • 另外,Angular 1.3 deferreds 没有被绑定,所以如果你使用的是 1.3 而不是 1.2,你必须使用 get("me", function(val){ deferred.resolve(val); }) 获取上下文,而不仅仅是 deferred.resolve
  • 太棒了!那行得通!这是最后一个函数: function getLoggedInMember() { var deferred = $q.defer(); Trello.members.get("我", function(user){ deferred.resolve(user); });返回 deferred.promise; }。路由配置没有变化。
  • 很高兴能帮上忙,最好先参考规范问题,其中提到了代码中的问题以及如何解决问题。此外,您可能需要考虑使用 Promise 构造函数(1.3 及更高版本)来更好地处理错误。

标签: angularjs promise angular-routing trello


【解决方案1】:

尝试添加

    deferred.promise.then(function (user) {
            return user;
        },function(error){
    console.log("Error");
    console.log(error);
    //ur return statement
    });

【讨论】:

  • 不工作。我之前确实尝试过。它没有给出任何错误。
  • 函数 getLoggedInMember() { var deferred = $q.defer(); Trello.members.get("我", deferred.resolve);返回 deferred.promise; }
【解决方案2】:

未测试,但尝试:

 .when('/Dashboard', {
     templateUrl: 'Views/Dashboard.html',
     controller: 'DashboardController',
     resolve: {
         user: MemberService.getLoggedInMember
     }

但是你的 getLoggedInMember 函数应该返回一个承诺。

根据角度文档:

resolve - {Object.=} - 应注入控制器的可选依赖映射。如果这些依赖项中的任何一个是承诺,路由器将等待它们全部被解决或在控制器被实例化之前被拒绝。如果所有的 Promise 都成功解决,则注入已解决的 Promise 的值并触发 $routeChangeSuccess 事件。如果任何一个 Promise 被拒绝,$routeChangeError 事件就会被触发。

【讨论】:

    【解决方案3】:

    这是有效的!

      function getLoggedInMember() {
        var deferred = $q.defer();
        Trello.members.get("me", function(user){ deferred.resolve(user); });
        return deferred.promise;
    }
    

    路由配置无需更改。 谢谢你,@Benjamin :)

    【讨论】:

    • 请考虑这个:function getFoo(){ return $q(function(resolve){ Trello.members.get("me", resolve); }) }。它更短,更安全,并且做同样的事情。
    • 酷!你能解释一下你所说的更安全是什么意思吗?
    • 是的,例如,如果 Trello 未定义或 Trello.members.get 同步抛出 - 而不是吞下异常,Angular 将跟踪它并调用异常处理程序,然后让您在 @ 中处理这些错误987654325@ 可以链接到返回值。
    猜你喜欢
    • 2017-09-02
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2022-01-25
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多