equivalenza in callback e non callback javascript

3

Sono abbastanza sicuro che i due snippet seguenti sono equivalenti, ma volevo ricontrollare:

STILE DI CALLBACK

function foo(input, callback) {
    // do stuff with input

    callback();
}

function bar(input, callback) {
    // do stuff with input

    callback();
}

foo("hi", bar("bye", function() {
                       // do something cool
                     }));

Si noti che i callback non accettano argomenti.

STILE PLAIN

function foo(input) {
    // do stuff with input
}

function bar(input) {
    // do stuff with input
}

foo("hi");
bar("bye");
(function() {
    // do something cool
})();

Naturalmente, se sono equivalenti, per me sarebbe logico utilizzare STILE DI PIÙ in quanto è più semplice e più pulito.

Mi rendo conto che lo scopo della funzione anonima (che fa qualcosa di interessante) è diverso nei due casi .. Non mi interessa l'aspetto di "equivalenza".

Aggiorna

Sto lavorando su qualche codice legacy e ne trovo un po 'confuso. Questo è il codice originale che ha suggerito questa domanda. Specificamente le note 6 o più righe di codice.

var CoolNamespace = (function () {
    var container_element,
        keysLength = 0;

    //
    // THE FOLLOWING 6 OR SO LINES IS WHAT I'M CURIOUS ABOUT
    //
    _createCoolObject(function (coolObject) {
        _appendFrameToContainer(coolObject, function () {

            // Post form
            _sendForm(function (form) {
                container_element.appendChild(form);
                form.submit();
            });
        }); 
    });

    function _sendForm (callback) {
        // Sends client data via post.
        if (keysLength != 0) {
            var form = _createForm();
        } else {
            throw new Error("error message stub");
        }
        callback(form);
    }

    function _appendFrameToContainer (frame, callback) {
        if (typeof container_element != "undefined") {
            container_element.appendChild(frame);
        } else {
            throw new Error("error message stub");
        }
        callback();
    }

    function _createCoolObject (callback) {
        var coolObject = { level: "very cool" };

        callback(coolObject);
    }

    function _handleMessage (event) {
        // it's not really about this function
    }

    function _createForm() {
        // it's not really about this function either
        var form;
        return form;
    }
})();

Quando si passava attraverso il codice, sembrava che il corpo di _createCoolObject fosse invocato prima dell'argomento (che è una funzione). Penso che la mia confusione fosse che un argomento su _createCoolObject è una funzione letterale che valuta una funzione ma quella funzione non viene valutata da sé fino alla riga callback(coolObject) . Grazie per il chiarimento !!

    
posta ari gold 17.04.2014 - 20:09
fonte

1 risposta

5

Non sono equivalenti nel loro ordine di esecuzione.

foo("hi", bar("bye", function() {
    // do something cool
}));

Questo deve prima valutare bar("bye", function() { … }) , quindi chiama foo("hi", …) con il risultato di tale chiamata. Poiché il valore di ritorno di bar è undefined , riceverai un errore quando lo chiami come funzione.

Se vuoi che l'esempio di callback sia equivalente al tuo semplice esempio, dovresti fare:

foo("hi", function() {
    return bar("bye", function () {
        // do something cool
    });
});

Vorrei anche cambiare la definizione di foo e bar in modo che facciano return callback() , il che consente un codice più generale.

Si noti che questo stile di callback è simile - ma non equivalente - a stile di passaggio continuo .

    
risposta data 17.04.2014 - 20:29
fonte

Leggi altre domande sui tag