promises promesas example javascript angularjs

javascript - promesas - ¿Por qué angular $ resource agrega objetos adicionales($ promesa, $ resolución...) a mi respuesta de datos?



promise angular 6 (5)

Debe devolver un resultado envuelto como {''resultado'': {''alguna_clave'': ''alguna_valor''}} desde su backend. O simplemente haz lo que se describe arriba.

Diary.getSharedWithMe(function(data) { delete data.$promise; delete data.$resolved; _self.sharedDiariesWithMe = data; }, function(error) { console.log(error) });

Devuelvo un recurso con una URL

$resource("http://foo.com/bar.json").get(). $promise.then(function(data){ $scope.result = data}, function(error){ $scope.msg = "error" } );

Retorno de recursos

["item1"...."item_n",.....,"$promise", "$resolved", "$get", "$save", "$query", "$remove", "$delete"]

¿Por qué obtengo todos esos objetos en mi conjunto de datos? Supongo que $ promesa simplemente devuelve todo esto y espera la respuesta del servidor. Pero una vez que tenga la respuesta del servidor, ¿dónde puedo obtener los datos de mi servidor sin la jerga Promesa?


Entonces, en caso de que alguien más esté tropezando aquí y no haya entendido las promesas / puntos angulares, eso es lo que está sucediendo. Cuando usas .then() o .get() obtienes una promesa y algunas funciones de ayuda en el mismo objeto. Esto es asombroso porque entonces no te preocupa que se definan las devoluciones de llamada y si los datos están disponibles porque el objeto promesa siempre tiene algunas propiedades. Este objeto contiene sus datos en bruto en otro objeto dentro. Así que el objeto de promesa está anidado, solo tiene que hacer referencia al objeto de datos cuando los datos estén listos.

Esto es lo que estaba haciendo

$resource("http://foo.com/bar.json").get(). $promise.then(function(data){ $scope.result = data}, //data is actually a promise object. function(error){ $scope.msg = "error" } );

promesa de objeto

Tenga en cuenta que los datos están realmente bajo otro objeto llamado "datos". Entonces, en su devolución de llamada exitosa para obtener solo los datos que debe hacer en este caso: data.data


Para eliminarlos automáticamente de cada solicitud, puede agregar un interceptor:

angular.module(''app'').config(config); config.$inject = [''$httpProvider'']; function config($httpProvider) { $httpProvider.interceptors.push(interceptor); } interceptor.$inject = []; function interceptor() { return { request: (config) => { if (config.data) { delete config.data.$promise; delete config.data.$resolved; } return config; } }; }



$resource devuelve un objeto o matriz que tendrá sus datos cuando finalice la llamada. Todas esas funciones están ahí para ayudarlo y $resource está destinado principalmente para las operaciones CRUD. Si desea obtener los datos, debe esperar a que se los devuelvan para poder utilizar la promesa. Si desea eliminar todas esas propiedades, puede usar angular.toJson para convertirlo a json, pero angular lo hace por usted cuando lo reenvía a un recurso o $ http call, por lo que no debería hacerlo.

$scope.data = $resource("http://foo.com/bar.json").get(); // $scope.data does not have your data yet, it will be // populated with your data when the AJAX call completes ... // later in a call from a save button maybe you can just do // this to post your changes back: $scope.data.$save();