2013-05-08 19 views
8

ho problemi quando si tratta di $ http promises in angularjs. lo sto facendo nel mio servizio: (la funzione getSomething dovrebbe concatenare due promesse)

la seconda funzione utilizza una funzione di richiamata esterna!

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

quando uso il servizio nel mio controller non emettere il console.log:

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

edit: se definisco la funzione di callback da solo in 'compactData' funziona, ma sto usando "jsonld.compact" da https://raw.github.com/digitalbazaar/jsonld.js/master/js/jsonld.js e QUESTO non funziona!

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

sto ottenendo l'uscita console.log nel jsonld.compact ma la determinazione non funziona e non so perchè ..

funziona solo con $ rootScope. Applicare $ (differita .resolve (compattato));

+0

A meno che 'compacted' è definita da qualche parte e si trova nella portata, allora probabilmente si desidera modificare' deferred.resolve (compattato); 'a' differita .resolve ("compattato"); ', e probabilmente lo stesso per' err'. –

+0

sry, 'compacted' e' err' sono definiti dalla funzione di callback! c'è anche l'output corretto da 'console.log (compattato)' in questa funzione, ma non nella funzione getSomething 'concatenata'. –

+0

Se ancora non funziona, testare 'blubb.getData()' e 'blubb.compactData()' separatamente prima di testare 'blubb.getSomething()'. –

risposta

1

promesse concatenamento lavora qui: jsfiddle

Nell'implementazione, se $http.get o compactData va male la tua console.log(data) non sarà chiamata.

Si dovrebbe forse prendere errori:

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

Non so perché ma non c'è uscita anche se cancello l'errore. ma quando uso '$ rootScope. $ Apply' funziona bene ... MA sto ricevendo il' Errore: $ digest già in corso 'adesso –

1

Ogni volta che si utilizza un callback esterno (esterno al AngularJS) che viene eseguito in una nuova svolta/Tick, devi chiamare $ apply() sul campo di applicazione appropriato dopo è stato invocato. Ciò consente ad AngularJS di sapere che deve essere aggiornato. Probabilmente vorrai assicurarti di chiamarlo solo una volta, dopo che tutte le promesse saranno state risolte. Per inciso, jsonld.js fornisce un'API promessa/futura, quindi se stai già utilizzando le promesse, non devi fare quel codice wrapper sopra. Invece si può fare:

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

// do something with the promise 
5

sto usando promesse concatenamento in questo modo:

  $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

vorrei suggerire di utilizzare una fabbrica, invece di un servizio.

tornare solo alla funzione dalla fabbrica e utilizzarlo nel vostro controller

Problemi correlati