2013-03-20 16 views
37

sto usando AngularJS 1.1.3 per utilizzare il nuovo $ risorse con promesse ...

Come posso ottenere la richiamata da questo? ho provato lo stesso modo in cui ho fatto con $ http:

$resource.get('...'). 
    success(function(data, status) { 
     alert(data); 
    }). 
    error(function(data, status) { 
     alert((status); 
    }); 

Ma non c'è 'successo' funzioni né 'Error' ...

Ho anche provato che:

$resource.get({ id: 10 },function (data) { 
    console.log('success, got data: ', data); 
}, function (err) { 
    alert('request failed'); 
}); 

Che stampa sempre "successo, ottenuto dati" anche se il ritorno è un ...

Qualche idea?

Grazie

+0

Utilizzare '$ then', vedere http://code.angularjs.org/1.1.3/docs/api/ngResource.$resource. – Tristan

+0

Puoi mostrarmi come? Perché penso che otterrò lo stesso risultato del mio secondo campione ... – Paul

+0

Questa API sta cambiando, quindi non mi fiderei di essa: https://github.com/angular/angular.js/pull/2060 – Tristan

risposta

49

partire da una PR on angulars resource e angolare 1,2 angolare sarà il passaggio di un modo più semplice di eseguire successo controllo/errore . Invece di collegare callback o un metodo $ then, sia Resource.get (..) che instance.get() supporteranno il metodo $ promise, che naturalmente restituisce una promessa per entrambi.

partire angolare 1.2 la funzione $ promessa andrà in diretta: $promise changes

Cambia la tua richiesta di "get" di essere qualcosa in questo senso (esempio originale è in angularjs.org prima pagina):

factory('Project', function($resource) { 
    var Project = $resource('https://api.mongolab.com/api/1/databases' + 
     '/youraccount/collections/projects/:id', 
     { apiKey: 'yourAPIKey' }, { 
     update: { method: 'PUT' } 
     } 
); 

    Project.prototype.update = function(cb) { 
    return Project.update({id: this._id.$oid}) 
     .$promise.then(
     //success 
     function(value){/*Do something with value*/}, 
     //error 
     function(error){/*Do something with error*/} 
    ) 
    }; 

    Project.prototype.destroy = function(cb) { 
    return Project.remove({id: this._id.$oid}) 
     .$promise.then(
     //success 
     function(value){/*Do something with value*/}, 
     //error 
     function(error){/*Do something with error*/} 
    ) 
    }; 

    return Project; 
}); 

qualche altra parte del controller si può istanziare una risorsa istanza "progetto" in cui è possibile utilizzare la stessa interfaccia per i successi e gli errori:

var myProject = new Project(); 

myProject.$get({id: 123}). 
    .$promise.then(
     //success 
     function(value){/*Do something with value*/}, 
     //error 
     function(error){/*Do something with error*/} 
    ) 
+1

Sto usando 1.2.1 in [questo violino] (http://jsfiddle.net/sonicblis/5tcQa/3/), ma ricevo un errore che indica che $ promise non è definito. 1.2.1 dovrebbe essere conforme ai dettagli di questa risposta, corretto? – sonicblis

+0

Sono appena stati avviati nuovi progetti che utilizzano le risorse Odata e Anguarl. Esattamente quello che stavo cercando con un bell'esempio, grazie. –

29
var MyResource = $resource("/my-end-point/:action", {}, { 
    getSomeStuff: { method:"GET", params: { action:"get-some-stuff" }, isArray: true }, 
    getSingleThing: { method:"GET", params: { action:"get-single-thing" }, isArray: false } 
}); 

function MyController(MyResource) { 
    var itemList = MyResource.getSomeStuff({}, function success() {}, function err() {}); 
    // will call: /my-end-point/get-some-stuff 
    // will be array. each object is resource's instance 
    var item = MyResource.getSingleThing({id:123}, function success() {}, function err() {}); 
    // will call: /my-end-point/get-single-thing?id=123 
    // will be object. an instance of resource 
} 

anche controllare l'esempio nei documenti: ngResource

+0

A una buona ragione * non * per usare questo è che un errore nella funzione di successo non verrà catturato dalla seconda funzione di errore, come farebbe normalmente con una promessa. Es:.. '' 'User.getSubscriptions() $ promise.then ((res) => { doesNotExist123(); alert ('riusci') }) catch ((E) => { alert ('failed'); console.log (e); }) '' ' Nell'ambito di una costruzione di promessa, il malfunzionamento avviserà, come ritengo dovrebbe. –

Problemi correlati