【问题标题】:[AngularJS][Ionic] Make Controller wait for Service that uses another $http service[AngularJS][Ionic] 让控制器等待使用另一个 $http 服务的服务
【发布时间】:2015-12-17 04:12:03
【问题描述】:

问题是控制器不等待使用另一个 $http 服务的服务,我没有得到任何数据。

services.js:

angular.module('starter.services', [])
    .factory('Likes', function ($http) {
        var likes;
        $http.get("http://localhost:8100/js/offers.json")
                .success(function (results) {
                    likes = results.offers;
                    console.log("ok!");
                })
                .error(function (results) {
                    console.log("error");
                });
        return {
            all: function () {
                return likes;
            },
            get: function (likeId) {
                for (var i = 0; i < likes.length; i++) {
                    if (likes[i].id === parseInt(likeId)) {
                        return likes[i];
                    }
                }
                return null;
            }
        };

    })

controllers.js(部分):

.controller('OneCtrl', function($scope, $stateParams, Likes) {
  $scope.offer = Likes.get($stateParams.likedId);
})

.controller('LikedCtrl', function($scope, $stateParams, $http, Likes) {
  $scope.liked = Likes.all();
})

我已经阅读了有关 Promise、async()、回调和 $q 的文章和主题,但我不知道如何将这些东西集成到我的代码中,尽管尝试了很多次。

【问题讨论】:

  • 您的服务需要返回一个承诺。不要使用successerror 回调,只使用then。不要异步分配给任何变量。

标签: angularjs promise ionic


【解决方案1】:

从您的服务中返回承诺:

angular.module('starter.services', [])
.factory('Likes', function ($http) {
    // likes is a promise of array of likes
    var likes = $http.get("http://localhost:8100/js/offers.json")
            // then allows transforming the promise of http response into a promise of something else
            .then(function(response) {
                // transforms the http response into an array of likes
                return response.data.offers;
            });
    return {
        // all returns a promise of array of likes
        all: function () {
            return likes;
        },
        // get returns a promise of like
        get: function (likeId) {
            // then allows transforming a promise of array of likes into a promise of something else
            return likes.then(function(likes) {
                // transform the array of likes into a single like
                for (var i = 0; i < likes.length; i++) {
                    if (likes[i].id === parseInt(likeId)) {
                        return likes[i];
                    }
                }
                return null;
            }
        }
    };
});

在控制器中

.controller('OneCtrl', function($scope, $stateParams, Likes) {
    Likes.get($stateParams.likedId).then(function(like) {
        $scope.offer = like;
    });
})

【讨论】:

  • 我复制了你的代码,更正了,这个“喜欢”是为了什么?我也不明白为什么我们在 OneCtrl 中调用 Likes.get 两次?
  • 对不起。复制粘贴错误。修复 then() 回调的代码。
  • 太好了,现在可以使用了!谢谢!虽然我没有得到两件事(我总是迷失在 javascript 中): - 'like' var 来自哪里?它出现在 function() 中,但它的值从何而来? - 控制器怎么知道,喜欢是一个承诺?
  • 我建议您阅读以下我写的文章,我希望这将使承诺更清晰。但别担心:它们是一个很难掌握的概念,我必须尝试很多次才能理解它们。 blog.ninja-squad.com/2015/05/28/angularjs-promises。控制器不知道喜欢是一个承诺。作为开发人员,您知道这一点,因为您编写了返回喜欢的服务,并通过说“此服务返回喜欢数组的承诺”来记录它。
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多