2015-04-16 23 views
1

我正在检查服务器,如果工作完成。我不想垃圾邮件的服务器,所以这就是为什么我会使用setInterval。Javascript jQuery然后在区间

我调用触发器函数,并在服务器上完成作业(可能在完成之前调用2-3次调用)后,该函数完成。

我知道我可以在间隔时间内调用我的finishFunction,并且可以解决它。但我想返回它,因为我从另一个js文件调用触发器函数。如果可能的话,我想在那里处理。

function trigger() { 
    var response = startInterval(); 
    response.then(function() { 
     //done finishFunction() 
    }); 
} 

function checkServer() { 
    var obj = { test: true } 
    var respons = $.ajax({ 
     url: "MyUrl", 
     data: JSON.stringify({ obj: obj }), 
     type: "POST", 
     contentType: "application/json", 
     dataType: "JSON", 
     cache: false 
    }); 
    return respons; 
} 

function startInterval() { 
    var inProgress = false; 
    var interval = setInterval(function() { 
     if (!inProgress) { 
      inProgress = true; 
      var response = checkServer().then(function (data) { 
       var isDoneInQueue = JSON.parse(data.d); 
       if (isDoneInQueue) { 
        //finishFunction()??? 
        clearInterval(interval); 
        return response; 
       }; 

       inProgress = false; 
      }); 
     } 
    }, 1000); 
} 
+2

是否存在与代码有关的特定问题? –

+0

我的问题是当我打电话给startInterval我的回报不是我的回应。而且我知道这是因为该功能在得到我的回应之前已经过了。正如我所说,我可以在“isDoneInQueue”中调用一个函数。但下面的解决方案解决了我的问题。 – thatsIT

回答

3

返回从功能Deferred对象,并解决它,当服务器工作已经完成:

function startInterval() { 
    var result = $.Deferred(); 
    var inProgress = false; 
    var interval = setInterval(function() { 
     if (!inProgress) { 
      inProgress = true; 
      checkServer().then(function (data) { 
       var isDoneInQueue = JSON.parse(data.d); 
       if (isDoneInQueue) { 
        clearInterval(interval); 
        result.resolve(data); 
       }; 
       inProgress = false; 
      }); 
     } 
    }, 1000); 
    return result; 
} 

无论你怎么称呼的resolve法,被发送到你的使用功能then方法:

function trigger() { 
    startInterval().then(function(data) { 
     //done finishFunction() 
    }); 
} 
+0

谢谢!我喜欢当我学到新东西! :) – thatsIT

相关问题