Domanda

Sto davvero lottando con l'uso differito o quando con la mia scrittura jQuery. Ho passato un numero di articoli qui e altrove (incluso Api.jquery.com) e penso che io sia un po 'troppo principiante per capire esattamente come usare queste chiamate.

Sto cercando di rinviare una funzione da eseguire fino a quando non è stata completata una funzione precedente nel mio script.

Ho

function datapoints () {
    //My long function here where I define $data
};
.

di cui il risultato è un array denominato $ dati. Ho bisogno di una variabile di dati $ da definire entrare nella mia prossima funzione, quindi voglio differerlo.

Ho provato a configurare il differimento come questo:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );
.

Apprezzerei davvero alcuni suggerimenti su come pulire questo. Ho provato a ricreare vari esempi ma il risultato ogni volta che è un errore di console che dice che $ dati non sono definiti. So che il codice funziona perché quando ho messo manualmente un sextimeout di alcuni secondi prima di eseguire la seconda funzione tutto funziona bene, ma penso che differirò è una soluzione migliore.

Grazie in anticipo!

È stato utile?

Soluzione

Prova a risolvere il tuo codice come questo:

deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);
.

Questo garantirà i dati che stai utilizzando è infatti i dati restituiti da datapoints().

Dovresti anche essere consapevole, che a meno che datapoints() sia una funzione ASYNC, il codice che hai scritto bloccherà il filettatura JS (I.e. Se esegui il browser - bloccherà l'UI).

Promesse / differite con funzioni sincroni non è molto utile.

Il solito modello sarebbe qualcosa del genere:

function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})
.

Altri suggerimenti

Prova questo codice:

function datapoints () {
    var deferred = $.Deferred();

    /* later, when data is ready, call:

        deffered.resolve(data);
    */

    return deferred.promise();
}


datapoints().then(function () {
    // runs when data is ready         
})
.

Non è in modo più sicuro qual è il tuo problema, ma questo jsfiddle sta funzionando bene per me.

function datapoints () {
    //My long function here where I define $data
    return {"datapoint1": 1, "datapoint2": 2};
};

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (data){
    // My function here where I use $data
    console.log("data: ", data);
});
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top