【问题标题】:Azure mobile services NodeJS Backend AngularJS Function not returning resultsAzure移动服务NodeJS后端AngularJS函数不返回结果
【发布时间】:2016-01-24 09:13:34
【问题描述】:

情况是这样的。

加载和调用所有适当的 javascript。我可以调试并单步执行,并查看正在从移动服务检索数据,并且 javascript 控制台中没有错误。

问题是 getTable 调用的“done()”被调用了两次,并且数据没有返回到调用该方法的模块函数,因此在页面中没有创建列表。

我确定我错过了一些简单的东西,但我似乎看不到它。

角度控制器

var appModule = angular.module('myApp');

appModule.controller('clientsController', [
    "$scope", "$rootScope", "$http", "$window", "ClientsDataService", function ($scope, $rootScope, $http, $window, ClientsDataService) {
        $rootScope.title = "Client List";
        $scope.clients = ClientsDataService.getAllClients();
    }
]);

角度模块函数

var clientModule = angular.module('myApp');

clientModule.factory("ClientsDataService", [
    '$http', '$q', function ($http, $q) {
        var _getAllClients = function () {
            return getAllClients();
        }

        return { "getAllClients": _getAllClients };
    }
]);

Azure 服务调用

function getAllClients() {
    azureClient.getTable("Client")
        .read()
        .done(
            function (results) {
                var clientArray = new Array();
                for (var i = 0; i < results.length; i++) {
                    clientArray.push({
                        "Name": results[i].ClientName,
                        "AcountExecutive": results[i].AccountExecutiveName,
                        "ClientPartner": results[i].ClientPartnerName,
                        "Revenue": results[i].RevenueInMillions,
                        "Industry": results[i].Industry,
                        "Notes": results[i].Notes,
                        "CompanyUrl": results[i].CompanyUrl,
                        "InfoUrl": results[i].InfoUrl,
                        "LogoUrl": results[i].LogoUrl,
                        "Lat": results[i].Latitude,
                        "Lng": results[i].Longitude
                    });
                }
                return JSON.stringify(clientArray);
            },
            function (err) {
                console.log(err);
            });
}

【问题讨论】:

    标签: javascript jquery angularjs node.js azure


    【解决方案1】:

    由于移动服务中的read()函数是一个异步函数,我们通常使用promise和$q来处理AngularJS中的异步调用。 这是我的测试代码sn-ps:

    var mobileServiceClient = new WindowsAzure.MobileServiceClient('https://<your_mobile_service_name>.azure-mobile.net/', '<manage keys>'),
                todoItemTable = mobileServiceClient.getTable('todoitem');
    
     angular.module("myApp",['myApp.services'])
        .controller('clientCtrl',function($scope,ClientsDataService){
            ClientsDataService.getAllClients().then(function(data){
                console.log(data);
                $scope.clients = data;
            })
        });
    
     angular.module('myApp.services',[])
        .factory("ClientsDataService",function($http,$q){
            return {
                getAllClients : function(){
                    var q = $q.defer();
                    getAllClients().done(function(todoItems){
                        if(todoItems.length>0){
                            q.resolve(todoItems);
                        }else{
                            q.reject(false)
                        }
                    });
                    return q.promise;
                }
            }
        });
    function getAllClients() {
        return todoItemTable
            .read()
            .then(
                function (todoItems) {
                    return todoItems;
                },
                function (err) {
                    console.log(err);
                });
    }
    

    关于您的问题getTable() 调用了两次,在我的本地测试中,只有在chrome 中标记Disable cache 复选框时,我才能重现该问题:

    如果我取消选中复选框或在 IE 浏览器中浏览,它只会调用一次。

    如果您有任何疑问,请告诉我。

    【讨论】:

    • 感谢您提供指向禁用缓存的指针。使用延迟是我正在研究的一条路径,但是您的示例代码绕过是我想要完成的目的。我不希望 angularjs 工厂中的服务调用,我想将服务调用抽象到一个单独的文件中(可以说是解耦)。
    • 我已经更新了代码 sn-p。请检查。有任何问题,请随时告诉我。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2013-04-29
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多