【问题标题】:Angular promise difference localhost vs deployedAngular 承诺差异 localhost 与已部署
【发布时间】:2016-09-03 17:58:04
【问题描述】:

我正在调用返回 true 或 false 的 REST 服务。

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 变量为“假”,等于 REST 调用返回的值。 但是,当部署(到 Google App Engine)时,我得到的结果是“包装在一个承诺中”,如下图所示。但是,当我通过浏览器窗口调用 REST 服务时,它应该返回 false。

promise result when deployed

promise result on localhost

为什么部署后这不起作用?

【问题讨论】:

    标签: javascript angularjs google-app-engine promise


    【解决方案1】:

    您描述的行为是我对这段代码的期望。当您的函数返回一个承诺时,您的调用将如下所示

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

    嗯,这并不像我希望的那样漂亮,但你可以改进它。但是,我建议您始终使用一致的返回类型。当您混合使用布尔值和承诺时,您必须在继续之前分析返回值的类型。

    【讨论】:

    • 他正在注入$stateParams,所以这很可能是一种解决方法。在 resolve 方法中,是否返回一个 Promise 并不重要,如果它是一个 Promise,路由器会为你解决它,所以你总是会得到已解决的 Promise,或者在这种情况下是原语 @987654326 @
    • @NexusDuck 您可能想详细说明 $resource 方法的结果如何最终在 ui-router 中被自动解析。我在这里没有看到注射。我唯一看到的是一个带参数的函数,我不知道该函数是如何调用的。
    • 嗯,$stateParams 是一个 ui-router 服务,通常用于解析函数
    • 从问题中的代码我猜想该函数被调用并且 $stateParams 作为参数被转发,并且因为我们在命名变量时都很懒惰,所以参数变量具有相同的函数中的名称。我不想草率下结论。我们可能需要来自操作的更多信息。我倾向于删除与问题不匹配的答案,因此应该不会造成任何伤害。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2018-10-03
    • 2020-10-12
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2018-12-24
    相关资源
    最近更新 更多