2017-08-17 1 views
1

Ich möchte true im Ergebnis, wenn die Funktion checkLoading() Anruf ist.warten bis Funktion Ergebnis in jquery zurückgeben

Ich habe eine Jquery-Funktion:

function checkLoading() { 
      console.log('checking loading'); 
      if ($('div.vX.UC').css('display') === 'none') { 
       console.log('Loading Complete'); 
       return true; 
      } else { 
       setTimeout(function() { 
        checkLoading(); 
       }, 500) 
      } 
     } 

ich diese Funktion nenne wie unten:

if(checkLoading()){ 
// do something 
} 

Aber vor Funktion Rückkehr undefined und nicht für die final Rückkehr warten.

Ich habe dies mit Deferred versucht. Aber das funktioniert nicht, ich habe versucht, Lösung:

function checkLoading() { 

      var dfrd1 = $.Deferred(); 
      console.log('checking loading'); 
      if ($('div.vX.UC').css('display') === 'none') { 
       console.log('Loading Complete'); 
       return dfrd1.promise(); 
      } else { 
       setTimeout(function() { 
        checkLoading(); 
       }, 500) 
      } 

      // return dfrd1.resolve(); 
      //return false; 
     } 

checkLoading().done(function() { 

         // do something. 
    }); 

Aber diese Lösung funktioniert nicht für mich.

+1

Was ändert sich dies, es zu verbergen? '$ ('div.vX.UC'). css ('display') === 'none'', von wo aus man/callback zurückliefern möchte, Schleifen mit Timeout sind nie eine gute Idee. imho –

Antwort

3

Sie müssen die Versprechen und resolve es zurückzukehren, nicht „promise“ es

var dfrd1 = $.Deferred(); 
function checkLoading(dfd) { 
    console.log('checking loading'); 
    if ($('div.vX.UC').css('display') === 'none') { 
    console.log('Loading Complete'); 
    return dfd.resolve(); 
    } else { 
     setTimeout(function() {checkLoading(dfd)}, 500) 
    } 

    return dfd.promise(); 
} 

checkLoading(dfrd1).then(function() { 

}); 
+1

' checkLoading() .done (function() {debugger;}; 'niemals am Debugger;, ich habe diese Lösung bereits ausprobiert. –

+0

Sie müßten die Defered an den nächsten Aufruf von checkLoading übergeben, dh' checkLoading (dfrd1) 'und diese übergeben zurückgestellt, um anzureden() an, anstatt eine neue zu erstellen und auflösen auf dieser. –

+0

@PatrickEvans, können Sie bitte die Antwort aktualisieren? –

0

Sie sollten versuchen, wie unten:

function checkLoading() { 
     var dfrd1 = $.Deferred(); 
     console.log('checking loading'); 
     if ($('div.vX.UC').css('display') === 'none') { 
       console.log('Loading Complete'); 
       dfrd1.resolve("Loading Completed"); 
     } else { 
       setTimeout(checkLoading, 500) 
     } 
     return dfrd1.promise(); 
    } 
1

Wenn keine Versprechungen verwenden, können Sie auch traditionell nutzen Rückrufen.

function checkLoading(callback) { 
    console.log('checking loading'); 
    if ($('div.vX.UC').css('display') === 'none') { 
     console.log('Loading Complete'); 
     callback(); 
    } else { 
     setTimeout(function() { 
      checkLoading(); 
     }, 500) 
    } 

} 

würde wie folgt verwendet werden:

checkLoading(function() { 
    // do something 
}); 
Verwandte Themen