javascript - originales - mensaje de cumpleaños para un amigo super especial
¿Esperando una promesa? (1)
Tengo el siguiente código angularjs:
$scope.clients = commonFactory.getData(clientFactory.getClients());
if ($scope.clients.length > 0) {
$scope.sampleForm.ClientId = $scope.clients[0].ClientId;
}
Y la función getData en commonFactory:
factory.getData = function (method) {
method.then(function (response) {
return response.data;
}, function (error) {
$rootScope.alerts.push({ type: ''error'', msg: error.data.ExceptionMessage });
});
};
El problema es que $ scope.clients.length no está definido cuando llega a esa línea debido a la llamada asíncrona.
¿Hay alguna manera de no hacer mi verificación de longitud hasta que sepa que se asignó $ scope.clients? He mirado algo como esto:
$scope.clients = commonFactory.getData(clientFactory.getClients()).then(function () {
if ($scope.clients.length > 0) {
$scope.sampleForm.ClientId = $scope.clients[0].ClientId;
}
});
Intentando encadenar mis promesas, pero sin dados ... el objetivo aquí es tener el método getData para evitar un montón de código repetitivo para detectar errores ... tal vez me esté equivocando.
Esta es la situación más básica para la que están las promesas. Simplemente debe hacer una promesa con var deferred = $q.defer()
al comenzar una operación asíncrona, resolver la promesa con deferred.resolve(result)
cuando la operación async esté completa, y devolver un deferred.promise
en su función. Los métodos asíncronos de Angular hacen esto internamente y devuelven promesas, por lo que puede devolver esas mismas promesas en lugar de crear nuevas promesas con $q.defer()
. Puedes adjuntar un .then
a cualquier cosa que devuelva una promesa. Además, si devuelve un valor de una función de then
, ese valor se envolverá en una promesa para que la cadena pueda continuar.
angular.module(''myApp'', [])
.factory(''myService'', function($q, $timeout, $http) {
return {
myMethod: function() {
// return the same promise that $http.get returns
return $http.get(''some/url'');
}
};
})
.controller(''myCtrl'', function($scope, myService) {
myService.myMethod().then(function(resp) {
$scope.result = resp.data;
});
})
Y aquí es un poco más divertido con el encadenamiento:
.factory(''myService'', function($q, $timeout, $http) {
return {
myMethod: function() {
// return the same promise that $http.get returns
return $http.get(''some/url'').then(function() {
return ''abc'';
});
}
};
})
.controller(''myCtrl'', function($scope, myService) {
myService.myMethod().then(function(result) {
console.log(result); // ''abc''
return someOtherAsyncFunc(); // for example, say this returns ''123''
}).then(function(result) {
console.log(result); // ''123''
});
})