Javascript 如何处理angularjs工厂服务中的$http异步问题?;

Javascript 如何处理angularjs工厂服务中的$http异步问题?;,javascript,angularjs,http,web,Javascript,Angularjs,Http,Web,在factory service js文件中,我创建了如下服务: DashboardFactory.restService = function(method) { var teststatus = "aaa"; switch (method) { case "getAll": $http.get($_REST_API_ROOT_URL + "clients").success(function(data) { teststatus = data; }).er

在factory service js文件中,我创建了如下服务:

DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {

case "getAll":

    $http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
        teststatus = data;
    }).error(function(error) {
        teststatus = 'Unable to load the client data: ' + error.message;
    });
    teststatus = "bbb";
    break;

}
return teststatus;
};
$scope.AllClients=DashboardFactory.restService("getAll","","");
在控制器中,代码如下所示:

DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {

case "getAll":

    $http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
        teststatus = data;
    }).error(function(error) {
        teststatus = 'Unable to load the client data: ' + error.message;
    });
    teststatus = "bbb";
    break;

}
return teststatus;
};
$scope.AllClients=DashboardFactory.restService("getAll","","");
我还将“AllClient”放在html页面上以监视结果:

{{AllClients}}
我认为“AllClient”应该显示来自远程服务器的API数据。但事实上,它总是给我“bbb”

我该怎么办


提前谢谢

teststatus
设置为“bbb”,并在API调用完成之前返回,因为调用是异步的

有关从API调用返回数据的不同方式,请参阅


您要做的是在
.success()
/
.error()
函数结束时返回
teststatus
,而不是在函数外部。这样,它只在完成API调用并将其设置为调用返回的数据后返回。

方法1:您根本不需要返回它。您可以将模型发送到服务
RestService.getAllClients=function(myModel)
,在模型成功时设置属性
myModel.AllClients=data
然后用
{{myModel.AllClients}}
显示它。直接在传入模型上设置属性将自动更新绑定

例如:

方法2:否则您需要返回整个
get
调用,该调用将返回一个
promise
,然后您需要根据f.e.在控制器上解决该问题

重构提示:您可以构建一个通用的rest服务工厂,然后为每种类型的调用实现该工厂,而不是构建一个充满switch case:s的“catch all”rest服务。因此,每种类型的rest调用都有一个方法。然后,您可以调用
restService.getAllClients
,而不是
DashboardFactory.restService
,它根据上述方法设置数据或返回承诺


Switch case不利于功能选择,您隐藏了功能,使代码容易隐藏错误。

这正是我想要做的。那我怎么做呢?我对angularjs非常陌生。删除
返回teststatus函数末尾的行。然后添加
返回teststatussuccess()
error()
函数中指定
teststatus
值后,都会执行code>操作。这将从success方法返回值,但不会从服务返回值。抱歉,我忽略了这一点。请参阅以从您的通话中返回数据。