我需要在提供 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 许可协议
您的
getSessionID()
函数是否返回承诺?如果是这样,你想要这样的代码:因此,您的登录服务会返回一个解析为会话 ID 的承诺。您可以将其保存在一个变量中以便在其他地方使用,也可以使用它来触发获取项目。
我还将您的
self
更改为vm
因为该命名是 Angular 约定,并将项目存储在vm.items
而不是直接在范围中。编辑: 您的登录代码已经返回一个承诺,而不是会话 ID。
return
在then
中只是返回一个解析为你返回值的新承诺。有几种方法可以链接多个
$http
请求。如果它们彼此独立,只需发出一堆请求并使用$q.all
在它们全部完成后进行处理。如果一个请求依赖于另一个请求的结果,你甚至可以这样做:
您的模板需要使用“controller as something”语法来声明控制器: