Credo di non credere in me stesso come un buon programmatore, ma ho scoperto questo metodo da solo (non suggerisco di essere il primo a farlo, ma non ho seguito una guida), quindi deve essere rotto in qualche modo.
$ q è principalmente un tipo di servizio di callback per ragioni asincrone, ma mi è servito anche in un altro modo.
Potrei avere più chiamate a un servizio di lunga durata, ma ho solo bisogno di una risposta una volta. Quindi voglio ignorare tutte le chiamate tranne dal primo e memorizzare il risultato in cache e tornare a tutti.
Se faccio una promessa a tutti quando ricevono il risultato quando la promessa è risolta, anche se è stata risolta prima che la promessa sia effettivamente data, questa è una bella caratteristica.
Quindi ho potuto fare la chiamata al dervice solo la prima volta che ho dato la promessa.
myApp.factory('serviceWithLongCall', function ($q, $timeout) {
var data = {}
var hasStarted = false;
var deferred = $q.defer();
return {
call: call
};
function call() {
if (!hasStarted) {
hasStarted = true;
console.log('timeout started');
$timeout(function () {
console.log('timeout ended');
data = 42;
deferred.resolve(data);
}, 3000);
}
return deferred.promise;
}
});
fiddle con esempio, fai clic su alcuni pulsanti e attendi 3 secondi dal primo clic, i clic successivi si verificheranno istantaneamente.
Qualcosa non funziona con questo metodo, avrò una condizione di gara?