为什么.then不是函数?

时间:2015-07-29 17:59:03

标签: angularjs

service.js

.factory('EventService', function ($http, $cordovaSQLite) {
    return {
        //some code here..
        populateData: function (data) {
            var items = [];
            for (i = 0; i < data.length; i++) {
                items.push(data[i]);
            }
            return items;
        }
    }
})

controller.js

.controller('NearCtrl', function ($scope, $http, $cordovaSQLite, EventService) {
    EventService.getDataFromDB().then(function (result) {
        if (result.length > 0) {
            EventService.populateData(result).then(function (items) {
                $scope.items = items;
            })
        } else {
            EventService.getDataFromApi().then(function () {
                EventService.getDataFromDB().then(function (result) {
                    EventService.populateData(result).then(function (items) {
                        $scope.items = items;
                    })
                })
            })
        }
    });
})

当我尝试运行此代码时,我得到“TypeError:EventService.populateData(...)。然后它不是函数”。

我做错了什么?感谢。

3 个答案:

答案 0 :(得分:21)

该服务需要返回一个承诺,而不是返回项目

populateData: function(data) {
    var deferred = $q.defer();
    var items = [];
    for (i = 0; i < data.length; i++) {
        items.push(data[i]);
    }
    deferred.resolve(items);
    return deferred.promise;
}

你可能不需要这个,因为你可以做到

var items = EventService.populateData(result);
//Do something with items here

如果您正在异步执行某些操作,通常会使用promises。就像调用API并等待响应一样。在这些情况下,响应可能需要几秒钟才能完成.then函数被调用。在你的情况下,如果你使该功能成为一个承诺,它几乎会被立即调用

编辑:以下是$ q文档clhs

的链接

答案 1 :(得分:2)

返回有承诺的内容或只是更改您的主叫代码:

populateData: return $http.get("www");

EventService.getDataFromApi().then(function () {
    EventService.getDataFromDB().then(function (result) {
        var response = EventService.populateData(result);
        $scope.items = response;
    });
});

答案 2 :(得分:0)

我有同样的问题,我的设备是 m1 Mac,我用 npm replace yarn to start 修复了它