Javascript 本地主机与已部署主机的角度差异
我正在调用一个REST服务,它返回true或falseJavascript 本地主机与已部署主机的角度差异,javascript,angularjs,google-app-engine,promise,Javascript,Angularjs,Google App Engine,Promise,我正在调用一个REST服务,它返回true或false function topLevelClosed($stateParams) { var id = $stateParams.id; return id ? Traject.topLevelClosed({id: id}).$promise : false; } var topLevelClosed = { method: 'GET', url: trajectURL + ':id/topLevelClosed' }; t
function topLevelClosed($stateParams) {
var id = $stateParams.id;
return id ? Traject.topLevelClosed({id: id}).$promise : false;
}
var topLevelClosed = {
method: 'GET',
url: trajectURL + ':id/topLevelClosed'
};
topLevelClosed是一个$resource方法。这在本地主机上非常有效。topLevelClosed变量为“false”,它等于REST调用返回的值。
然而,当部署(到谷歌应用程序引擎)时,我得到的结果是“包装在承诺中”,如下图所示。但是,当我通过browserwindow调用REST服务时,它会返回false
为什么在部署时这不起作用?您描述的行为正是我对这段代码的期望。当您的函数返回一个承诺时,您的调用将如下所示
topLevelClosed($stateParams).then(function(value){
/* do something with value */
});
如果topLevelClosed返回布尔值,则可以直接访问该值,而无需使用然后(…)
为了获得一致的行为,我总是会回报一个承诺,比如:
function topLevelClosed($stateParams) {
var deferred = $q.defer();
if(id){
Traject.topLevelClosed({id: id}).$promise.then(function(value){
deferred.resolve(value);
});
} else {
deferred.resolve(false);
}
return $q.promise;
}
这并不像我希望的那么漂亮,但你可以改进它。但是,我建议您始终使用一致的返回类型。当您混合布尔值和承诺时,您必须在继续之前分析返回值的类型。他正在注入
$stateParams
,因此这很可能是一种解决方法。在解决方法中,无论你是否回报承诺,如果这是一个承诺,路由器将为您解决它,因此您将始终得到已解决的承诺,或者在本例中是原语false
@NexusDuck。您可能需要详细说明$resource方法的结果如何在ui路由器中自动解决。我看这里没有注射。我唯一看到的是一个带参数的函数,我不知道该函数是如何调用的。是一个ui路由器服务,通常用于解析函数。从问题中的代码中,我猜该函数被调用,$stateParams作为参数转发,因为我们在命名变量时都很懒惰,所以参数变量在函数中有相同的名称。我不想仓促下结论。我们可能需要从op中获得更多信息。我倾向于删除与问题不匹配的答案,因此不会造成任何伤害。