Javascript 获取$resource返回未定义的请求

Javascript 获取$resource返回未定义的请求,javascript,angularjs,Javascript,Angularjs,这将输出我的连接字符串。而是$scope.newPost.content返回: $scope.newPost.content = "Part 2 of phrase" $scope.newPost.content = Phrase.get({id: $scope.newPost.phrase_id}).$promise.then( (result) -> return result.content + " " + $scope.newPost.content ) conso

这将输出我的连接字符串。而是$scope.newPost.content返回:

$scope.newPost.content = "Part 2 of phrase"
$scope.newPost.content = Phrase.get({id: $scope.newPost.phrase_id}).$promise.then(
  (result) ->
    return result.content + " " + $scope.newPost.content 
)

console.log($scope.newPost.content)

我做错了什么。

这是一个非常常见的错误,承诺一开始就有点难以把握

我将逐行解释,下面的顺序与运行代码时的顺序相同

1) $scope.newPost.content=“短语的第2部分”

这样,您就为newPost.content变量分配了一个字符串,到目前为止,一切正常

2) $scope.newPost.content=Phrase.get({bla bla…})

现在,这将用承诺对象替换前面的字符串,它不再是字符串。 这样的事情是可能的,因为javascript疯狂灵活的非强类型方式,lol。这不会等待服务器上的get完成,这就是你的问题所在,下一行将在这之后立即运行,并且将具有错误的值

3) log($scope.newPost.content)

这就是事情变得混乱的地方,现在,你的newPost.content不是一个字符串,它是2的承诺,控制台上的输出证明了这一点。(该输出是一个promise对象)

您的newPost.content只有在2处的承诺解析时才有您的连接字符串,这可能需要很长或很短的时间才能完成,需要注意的重要一点是,它没有阻塞其余的代码,因此3将在2之后立即执行。。。 把承诺看作是在另一个线程中运行的东西

因此,我的原始答案仍然是,您的变量只有在承诺解决后才具有所需的值,因此您必须在这之后采取行动,通常在then函数中,我做了一些更改来说明这一点并避免无用的赋值:

Object {then: function, catch: function, finally: function}
POST http://localhost:3000/api/v1/posts.json 422 (Unprocessable Entity) //content cant be blank

希望有帮助。

控制台.log行在异步调用之外,这意味着它将在检索资源之前运行

  • 代码中事件的顺序为:
  • 将字符串分配给
    scope.newPost.content
  • 开始检索资源
  • 为scope.newPost.content分配一个新值,并立即返回get,它看起来像一个promise对象
  • 将此承诺对象写入控制台日志
  • 接收资源get调用的结果
  • 将此调用的结果分配给
    scope.newPost.content
正如你应该看到的,第4-6项不是你所希望的顺序


如果要写入异步调用的结果,则需要在解析承诺之后进行。最容易做到这一点的地方是
然后
回调函数。

我的问题在于误解了承诺的工作原理 它是通过定义或实例化承诺之外的变量来解决的 然后,您可以在then()块内对其进行更改,这些更改在then()之外仍然有效

工作示例如下所示:

var part2 = "Part 2 of phrase"
Phrase.get({id: $scope.newPost.phrase_id}).$promise.then(
  function(result){
      $scope.newPost.content = result.content + ' ' + part2;
      console.log($scope.newPost.content);
  }
);

我把问题改得更具体一些,关于我想要达到的目标,关于这个…修正了。
   $scope.newPost.content = "Part 2 of phrase";
    Phrase.get({id: $scope.newPost.phrase_id}).$promise.then(function(result){
        $scope.newPost.content = result.content + " " + $scope.newPost.content; 
    });

    console.log($scope.newPost.content)