2013-03-20 18 views
37

jestem używając angularjs 1.1.3 do korzystania z nowego zasobu $ obietnicami ...

Jak mogę uzyskać wywołania zwrotnego z tym? Próbowałem w ten sam sposób co ja z $ http:

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

Ale nie ma 'powodzenie' ani funkcji 'Błąd' ...

Próbowałem również, że:

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

To zawsze drukuje "sukces, ma dane", nawet jeśli jest to zwrotny pomysł, czy jest to jakiś pomysł?

Dzięki

+0

Użyj '$ then', zobacz http://code.angularjs.org/1.1.3/docs/api/ngResource.$resource. – Tristan

+0

Czy możesz mi pokazać, jak? Ponieważ myślę, że otrzymam taki sam wynik, jak moja druga próbka ... – Paul

+0

Ten interfejs API się zmienia, więc nie będę polegał na tym: https://github.com/angular/angular.js/pull/2060 – Tristan

Odpowiedz

49

Jak z PR on angulars resource i kątowe 1,2 kątowa będzie przejście na prostszy sposób wykonywania sukces Sprawdzanie/błędu . Zamiast dołączania wywołań zwrotnych lub metody $ then, zarówno Resource.get (..), jak i instance.get() będą obsługiwać metodę obietnicy $, która naturalnie zwraca obietnicę obie.

Jak kątowe 1.2 funkcja $ obietnica trafi na żywo: $promise changes

Zmień swoją prośbę „dostać” się coś wzdłuż tych linii (oryginalna przykładem jest angularjs.org stronie głównej):

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; 
}); 

Gdzieś indziej w kontrolerze można instancji zasobu „projekt” wystąpienie, w którym można korzystać z tego samego interfejsu dla sukcesów i błędów:

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

Używam 1.2.1 w [tym skrzypiec] (http://jsfiddle.net/sonicblis/5tcQa/3/), ale otrzymuję komunikat o błędzie, że $ obietnica jest niezdefiniowana. 1.2.1 powinien odpowiadać szczegółom tej odpowiedzi, prawda? – sonicblis

+0

Właśnie rozpoczęliśmy nowe projekty, które wykorzystują zasoby Odata i Anguarl. Dokładnie tego, czego szukałem z miłym przykładem, dziękuję. –

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 
} 

Sprawdź również przykład w docs: ngResource

+0

A dobrym powodem * nie * do użycia jest to, że błąd w funkcji sukcesu nie zostanie złapany przez drugą funkcję błędu, jak to zwykle bywa z obietnicą. Ex: '' 'User.getSubscriptions(). $ Promise.then ((res) => { doesNotExist123(); alert (" udało się ") }). Catch ((e) => { alert ("nie"); console.log (e); }) '' ' Pod obietnicą budowy, nie powiodło się, ponieważ uważam, że powinno. –