AngularJS $resource save返回Promise而非响应值,如何获取保存对象ID?
解决Angular控制器中获取REST save返回ID时拿到$promise的问题
嘿,这个问题我之前也踩过坑!核心原因很简单:$resource的save方法是异步执行的,它默认返回的是一个空的占位对象,同时附带$promise属性。当你直接console.log这个返回值时,后端的请求可能还没完成,所以你看到的是包含$promise的对象,而非最终带ID的响应数据。
正确的处理姿势:用$promise的then回调等异步完成
你需要通过返回的$promise的.then()方法来监听请求完成的事件,只有在成功回调里,才能拿到完整的、带有ID的已保存对象。
先确认你的REST Factory定义(参考示例)
假设你的Factory是基于$resource定义的,大概是这样:
angular.module('myApp') .factory('MyResource', ['$resource', function($resource) { return $resource('/api/my-resource/:id', { id: '@id' }, { save: { method: 'POST' } // 后端如果是PUT的话可以调整,默认POST没问题 }); }]);
控制器里正确调用save并获取ID
别直接打印或赋值返回值,改成用then()处理异步响应:
angular.module('myApp') .controller('MyController', ['MyResource', function(MyResource) { // 准备要保存的对象数据 var newItem = { name: "测试数据", description: "这是一条测试记录" }; // 调用save,然后通过$promise的then等待请求完成 MyResource.save(newItem).$promise .then(function(savedItem) { // 这里请求已经成功完成!savedItem就是后端返回的带ID的对象 var savedId = savedItem.id; // 拿到你要的ID console.log("保存成功,ID是:", savedId); // 在这里做后续操作,比如跳转到详情页、更新列表等 }) .catch(function(error) { // 别忘了处理请求失败的情况,比如给用户弹个错误提示 console.error("保存失败:", error); }); }]);
为什么直接拿返回对象不行?
Angular的$resource用了延迟加载的机制:返回的对象一开始是空的,当AJAX请求完成后,Angular才会把后端返回的数据填充到这个对象里。但如果你在请求完成前就console.log它,看到的只是初始的空对象加$promise——虽然之后对象会被更新,但你没法及时捕获到那个时刻。用then()就能确保你在请求彻底完成后再处理数据。
特殊情况:如果后端直接返回纯ID而非完整对象?
要是你的save接口返回的不是JSON对象,而是直接返回ID字符串,那在then回调里直接取返回值就行:
MyResource.save(newItem).$promise .then(function(response) { var savedId = response; // 直接拿到ID console.log("保存成功,ID是:", savedId); });
内容的提问来源于stack exchange,提问作者Rasool Ghafari
相关产品推荐
相关产品推荐

