本地主机与部署的角度承诺差异

Angular promise difference localhost vs deployed

本文关键字:承诺 主机 部署      更新时间:2023-09-26

我正在调用一个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'
};

topLevelClosed是$resource方法。这非常适用于localhost。topLevelClosed变量为"false",它等于REST调用返回的值。然而,当部署(到谷歌应用引擎)时,我得到的结果"被承诺包裹",如下图所示。然而,当我通过browserwindow调用REST服务时,它会返回false。

部署时的承诺结果

localhost 上的promise结果

为什么部署后不起作用?

您描述的行为正是我对这段代码的期望。当你的函数返回一个承诺时,你的调用看起来像这个

topLevelClosed($stateParams).then(function(value){
  /* do something with value */
});

如果topLevelClosed返回布尔值,则可以直接访问该值而不使用then(...)

为了获得一致的行为,我总是会返回一个承诺,比如:

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;
}

这并没有我希望的那么漂亮,但你可以改进它。不过,我建议你总是使用一致的返回类型。当混合布尔值和promise时,在继续之前必须分析返回值的类型。