AngularJS o Angular 2 forniscono qualcosa di simile al middleware Redux in modo che i dati AJAX siano immediatamente disponibili?

3

Sto imparando React / Redux, e una caratteristica che mi piace è, quando spari un'Azione, in realtà fornisci un request come "risultato" o ciò che è chiamato payload in Redux, e il Redux il middleware non passerà questa azione ai riduttori per comporre gli stati dell'applicazione finale. Invece, attenderà il request , che è una promessa, da risolvere e sostituirà payload con la risposta effettiva (compresi i dati). Quindi payload conterrà infine i dati effettivi e passerà ai riduttori per comporre gli stati dell'applicazione finale.

In questo modo, è quasi come se tu possa trattarlo come dati immediati. Non devi affatto preoccuparti di AJAX.

Quindi, se si confronta questo con AngularJS e Angular 2, forniscono uno schema come questo?

    
posta 太極者無極而生 31.03.2017 - 14:56
fonte

1 risposta

2

Sembra che tu ti stia riferendo a redux-promise , che astrae il lavoro di creare la tua promessa- gestione della funzionalità che invia (o meno) dopo che la promessa è stata fatta. Questa astrazione è facile da usare perché è inserita nel redux store come middleware - infatti, il codice sorgente principale di tale libreria è a malapena 25 righe di codice .

Poiché tutte le versioni di Angular non utilizzano un archivio di ridondanza per impostazione predefinita, non c'è un posto dove collegare un middleware. Potresti, tuttavia, implementare una piccola funzione di utilità "dispatch di ambito" che prevede di ricevere promesse che risolvono un determinato valore:

// Somewhere in your controller...
var buildDispatcher = function (vm) {
    var assign = function (values) {
        Object.assign(vm, values);
    };

    return function (value) {
        if (value.then) {
            return value.then(result => {
                // Here we assume that the
                // result returns an object with
                // keys and values
                return assign(result);
            });
        } else {
            assign(value);
        }
    };
};

vm.dispatch = buildDispatcher(vm);

vm.dispatch(new Promise(function (resolve, reject) {
    resolve({
        someKey: true
    });
}));

Noterai che per far funzionare tutto questo come "magicamente" come in redux, dobbiamo assicurarci che tutti i valori restituiscano oggetti le cui chiavi sono poi copiate nello scope del controller (sto usando Angular's < a href="https://johnpapa.net/angularjss-controller-as-and-the-vm-variable/"> "controller come" sintassi qui). In sostanza, stiamo creando un oggetto di stato a livello di controller con una funzione di invio minima che decomprime i valori di ritorno delle promesse e li assegna all'ambito, oppure se il valore di ritorno non ha un metodo di indicazione .then di promessa, assegna direttamente il valore allo scope (ma deve comunque essere un oggetto).

Potremmo anche dover eseguire la funzione $digest (almeno in Angular 1 - non sono sicuro di circa 2+) per poter riconoscere questo compito, ma ho omesso tale dettaglio per chiarezza.

    
risposta data 31.03.2017 - 16:55
fonte

Leggi altre domande sui tag