GET请求,$resource返回未定义

GET request with $resource returning undefined

本文关键字:返回 未定义 resource 请求 GET      更新时间:2023-09-26
$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)

这将输出我连接的字符串。而不是scope.newPost美元。返回内容:

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

console.log行在异步调用之外,这意味着它将在资源被检索之前运行。

  • 事件在你的代码中的顺序是:
    1. scope.newPost.content赋字符串
    2. 开始检索资源。
    3. scope.newPost.content赋一个新的值,并立即返回get,这看起来像一个promise对象。
    4. 将承诺对象写入控制台日志。
    5. 接收资源get调用的结果。
    6. 将此呼叫结果赋值给scope.newPost.content
如你所见,4 - 6项的顺序与你所希望的不一样。

如果你想写异步调用的结果,它需要在promise被解决之后发生。最容易做到这一点的地方是在then回调函数中。

这是一个很常见的错误,承诺一开始很难把握。

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

1) scope.newPost美元。content = "Part of Part of phrase"

这样,你就给你的newPost分配了一个字符串。内容变量,到目前为止,一切顺利

2) scope.newPost美元。content =短语。Get ({bla bla bla…});

现在用promise对象替换了之前的字符串,它不再是字符串了。这样的事情是可能的,由于javascript的疯狂灵活的非强类型的方式,哈哈。这将不会等待服务器上的get完成,这就是困扰您的地方,下一行将在此之后立即运行,并且将具有错误的值。

3) console.log (scope.newPost.content美元)

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

你的职位。当promise at 2解析时,Content只会有你连接的字符串,它可能需要很长或很短的时间来完成它,重要的是要注意它不会阻塞其余的代码,所以3将在2之后立即执行…把promise看作是在另一个线程中运行的东西。

所以,我原来的答案仍然是,你的变量只会有期望的值在承诺解决后,所以你必须采取行动之后,通常在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);
  }
);

希望对你有帮助。

我的问题是误解了承诺是如何工作的它是通过在承诺之外定义或实例化变量来解决的然后,你可以在then()代码块中对它进行修改,这些修改在then()

之外仍然有效。

工作示例如下:

   $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)