Javascript 获取$resource返回未定义的请求
这将输出我的连接字符串。而是$scope.newPost.content返回: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 = "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
如果要写入异步调用的结果,则需要在解析承诺之后进行。最容易做到这一点的地方是
然后回调函数。我的问题在于误解了承诺的工作原理
它是通过定义或实例化承诺之外的变量来解决的
然后,您可以在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)