在另一个 AngularJS 之后执行函数
Execute function after another 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;
});
你的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。 then
内部return
只是会返回一个新的承诺,该承诺解析为您返回的值。
有几种方法可以链接多个$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; });
模板需要使用"控制器即某物"语法声明控制器:
<div ng-controller="TestController as test" ng-bind="test.items"></div>
您是否尝试过嵌套第二个函数,如下所示? 没有构造函数调用?
loginService.getSessionID().then(function(sessionID){
dbObjectsDAO.getAll(sessionID).then(function(arrObjItems){
$scope.items = arrObjItems;
});
});
Mb 你的范围是错误的
..then(function(sessionID){...}) ?
你可以像这样尝试一些:
var vm=this;
loginService.getSessionID().then(function(sessionID){
vm.constructor();
});
相关文章:
- 如何做到这一点,使代码在不传递条件后执行函数
- javascript自执行函数-不同的语法
- JavaScript:只有当数组中的所有项都为true时才执行函数
- iFrame url更改时执行函数
- 为什么AngularJS在每个摘要循环上都执行函数
- 如何使用setInterval执行函数
- 当*ngFor以角度2结束时执行函数
- Ajax调用完成后如何执行函数
- 在显示引导弹出窗口之前执行函数
- 从自执行函数返回函数的Javascript性能命中率
- 在操作完成时执行函数
- jquery/js中的自执行函数
- 如何仅在完成对gap.client.youtube的请求.execute后执行函数
- 构造函数函数中的自执行函数的OO上下文/范围
- Javascript未使用=运算符执行函数
- AngularJS:如何按照预定义的顺序执行函数
- 在不使用隔离作用域的情况下执行函数的角度指令
- 如何在页面加载后执行函数是在 AngularJS 中完成的
- 完成页面加载后执行函数
- 如何在完成完全执行函数后触发循环