等到函数返回结果在jquery中

时间:2017-08-17 07:07:37

标签: javascript jquery

当调用函数true时,我希望结果为checkLoading()

我有一个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.
   });

但是这个解决方案并不适合我。

3 个答案:

答案 0 :(得分: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 :(得分:1)

如果不使用promises,您传统上也可以使用回调。

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

答案 2 :(得分: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();
    }