在另一个 AngularJS 之后执行函数

新手上路,请多包涵

我需要在提供 sessionId 的一种登录功能之后执行一个获取数据的功能。这个 sessionId 是第二个功能所必需的。

 app.controller('TestController',
 function ($scope, dbObjectsDAO, loginService){

    var sessionID = loginService.getSessionID(); //Login function

    var self = this;

    this.items = [];

    this.constructor = function() {
        dbObjectsDAO.getAll(sessionID).then(function(arrObjItems){
            $scope.items = arrObjItems;
        });
    };

    this.constructor(); //get the data

    return this;

});

我尝试了几种变体,例如:

 loginService.getSessionID().then(function(sessionID){
  this.constructor();  //also with just constructor();
});

但我总是收到错误(在上述情况下: Illegal constructor )。

那么我怎样才能设法一个接一个地执行一个函数呢?也许回调结构在这里会有所帮助,但我不知道如何实现它。


编辑

这是登录代码:

 app.service('loginService', function($http, $q) {

    this.getSessionID = function()
    {
        return $http({
            method: "GET",
            url: "http://localhost:8080/someRequestDoneHere"
        }).then(function(response)
        {
            return response.data.sessionId; // for example rYBmh53xbVIo0yE1qdtAwg
        });
    };

    return this;

});

原文由 JohnDizzle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 262
2 个回答

您的 getSessionID() 函数是否返回承诺?如果是这样,你想要这样的代码:

 app.controller('TestController',
 function ($scope, dbObjectsDAO, loginService){

    var sessionID;
    var vm = this;
    vm.items = [];

    loginService.getSessionID()
    .then(function(sid) {
        sessionID = sid;
        return dbObjectsDAO.getAll(sessionID);
    })
    .then(function(arrObjItems){
        vm.items = arrObjItems;
    });
 });

因此,您的登录服务会返回一个解析为会话 ID 的承诺。您可以将其保存在一个变量中以便在其他地方使用,也可以使用它来触发获取项目。

我还将您的 self 更改为 vm 因为该命名是 Angular 约定,并将项目存储在 vm.items 而不是直接在范围中。

编辑: 您的登录代码已经返回一个承诺,而不是会话 ID。 returnthen 中只是返回一个解析为你返回值的新承诺。

有几种方法可以链接多个 $http 请求。如果它们彼此独立,只需发出一堆请求并使用 $q.all 在它们全部完成后进行处理。

 var promise1 = $http(something)
.then(function(response) { vm.data1 = response.data; return vm.data1; });
var promise2 = $http(something)
.then(function(response) { vm.data2 = response.data; return vm.data2; });

$q.all([promise1, promise2], function(values) {
    // here can safely use vm.data1 or values[0] as equivalent
    // and vm.data2 or values[1].
});

如果一个请求依赖于另一个请求的结果,你甚至可以这样做:

 var promise1 = $http(something)
.then(function(response) {
    vm.data1 = response.data;
    return { method:'GET', url: response.data.link}
 });
 var promise2 = promise1.then($http)
.then(function(response) { vm.data2 = response.data; return vm.data2; });

您的模板需要使用“controller as something”语法来声明控制器:

 <div ng-controller="TestController as test" ng-bind="test.items"></div>

原文由 Duncan 发布,翻译遵循 CC BY-SA 3.0 许可协议

你试过像这样嵌套第二个函数吗?没有构造函数调用?

 loginService.getSessionID().then(function(sessionID){
    dbObjectsDAO.getAll(sessionID).then(function(arrObjItems){
        $scope.items = arrObjItems;
    });
});

原文由 JoSeTe4ever 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏