2013-05-08 16 views
8

Mam problemy jeśli chodzi o obietnice $ http w angularjs. Robię to w mojej usłudze: (funkcja getSomething powinna wiązać obie obietnice)

druga funkcja korzysta z zewnętrznej funkcji oddzwaniania!

 
app.service('blubb', function($http, $q) { 

    var self = this; 

    this.getSomething = function(uri, data) { 
    return self.getData(uri).then(function(data2) { 
     return self.compactData(uri, data2); 
    }); 
    }; 

    this.getData = function(uri) { 
    var deferred = $q.defer(); 
    $http.get(uri).success(function(data) { 
     deferred.resolve(data); 
    }).error(function() { 
     deferred.reject(); 
    }); 

    return deferred.promise; 
    }; 

    this.compactData = function(uri, data) { 
    var deferred = $q.defer(); 
    /* callback function */ 
     if(!err) { 
     console.log(compacted); 
     deferred.resolve(compacted); 
     } else { 
     console.log(err); 
     deferred.reject(err); 
     } 
    /* end of function */ 

    return deferred.promise; 
    }; 
}); 

podczas korzystania z usługi w moim kontrolera to nie wyjście console.log:

 
blubb.getSomething(uri, input).then(function(data) { 
    console.log(data) 
}); 

edit: gdybym zdefiniować funkcję zwrotną przez siebie w „compactData” działa ale używam "jsonld.compact" z https://raw.github.com/digitalbazaar/jsonld.js/master/js/jsonld.js i TO nie działa!

 
    jsonld.compact(input, context, function(err, compacted) { 
     if(!err) { 
     console.log(compacted); 
     deferred.resolve(compacted); 
     } else { 
     deferred.reject('JSON-LD compacting'); 
     } 
    }); 

Dostaję wyjście console.log w jsonld.compact ale postanowienie nie działa i nie wiem dlaczego ..

działa tylko z $ rootScope. $ Zastosowania (odroczony .resolve (zagęszczony));

+0

ile 'compacted' jest zdefiniowana gdzieś i jest w zasięgu, to prawdopodobnie chcesz zmienić' deferred.resolve (ubity); 'na' odroczony .resolve ("compacted"); ', i prawdopodobnie tak samo dla' err'. –

+0

sry, 'compacted' i' err' są zdefiniowane przez funkcję zwrotną! istnieje również prawy wynik z 'console.log (compacted)' w tej funkcji, ale nie w sprzężonej funkcji getSomething. –

+0

Jeśli to nadal nie działa, przetestuj 'blubb.getData()' i 'blubb.compactData()' przed testowaniem 'blubb.getSomething()'. –

Odpowiedz

1

łańcuchowym obietnice działa tutaj: jsfiddle

W implementacji, jeśli $http.get lub compactData idzie źle swój console.log(data) nie będzie dzwonić.

Powinieneś może złapać błędy:

blubb.getSomething(uri, input).then(function(data) { 
     console.log(data);  
    }, function(err) { 
     console.log("err: " + err); 
    }); 
+0

Nie wiem, dlaczego, ale nie ma wyjścia, nawet jeśli wyloguję błąd. , ale kiedy używam '$ rootScope. $ Apply' działa dobrze ... ALE otrzymuję komunikat' Błąd: $ skrót już w toku ' –

1

Gdy używasz zewnętrznego (zewnętrzny do angularjs) callback, który działa w nowej kolei/kleszczy, trzeba zadzwonić $ apply() w odpowiednim zakresie po został przywołany. Dzięki temu AngularJS wie, że musi zostać zaktualizowany. Prawdopodobnie będziesz chciał się upewnić, że dzwonisz tylko raz - po tym, jak wszystkie obietnice zostały rozwiązane. Na marginesie, jsonld.js zapewnia obiecujące/przyszłe API, więc jeśli już korzystasz z obietnic, nie musisz robić tego kodu powyżej. Zamiast tego można zrobić:

var promisesApi = jsonld.promises(); 
var promise = promisesApi.compact(input, context); 

// do something with the promise 
5

Używam łańcuchowym obietnic tak:

  $http.get('urlToGo') 
       .then(function(result1) { 
        console.log(result1.data); 
        return $http.get('urlToGo'); 
       }).then(function(result2) { 
        console.log(result2.data); 
        return $http.get('urlToGo'); 
       }).then(function(result3) { 
        console.log(result3.data); 
       }); 
0

Proponuję użyć Factory zamiast usługi.

Wystarczy powrócić funkcję z fabryki i użyć go w kontrolerze

Powiązane problemy