2017-08-17 11 views
1

函數返回的結果我想結果,當函數checkLoading()是調用true等到jQuery的

我有一個jQuery函數:

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

我調用這個函數象下面這樣:

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

但上面的函數返回undefined,而不是等待final回報。

這個我試過用Deferred。但這是行不通的,我嘗試了下面的解決方案:

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. 
    }); 

但是這個解決方案對我不起作用。

+1

什麼正在改變這種隱藏呢? '$(「div.vX.UC」)。CSS(「顯示」)===「none''這就是你想要返回/回調出的,循環使用超時是不是一個好主意恕我直言 –

回答

3

您需要返回的承諾和resolve它,而不是「promise」它

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(函數(){調試;};'有去無回在調試;,我已經嘗試過這種解決方案 –

+0

您將需要遞延傳遞給checkLoading的下一個調用,即'checkLoading(dfrd1)'和使用該過去了。推遲到呼籲,而不是創建一個新的和一個叫決心解決()。 –

+0

@PatrickEvans,可以請你更新的答案? –

0

你應該嘗試象下面這樣:

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

如果不使用的承諾,你也可以傳統上使用回電話。

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

} 

會像這樣使用:

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