Javascript 等待函数完成,然后返回一个值
我让这个函数Javascript 等待函数完成,然后返回一个值,javascript,http,xmlhttprequest,Javascript,Http,Xmlhttprequest,我让这个函数离线。check(),执行时间为1秒..所以下面的函数没有等待它,并且在第一次执行时总是返回false。我使用了设置超时..但它总是返回null function checkstats() { Offline.check(); // This returns Offline.state=up or down and it takes 1 seconds to complete. if(Offline.state=="up") { r
离线。check()代码>,执行时间为1秒..所以下面的函数没有等待它,并且在第一次执行时总是返回false。我使用了设置超时..但它总是返回null
function checkstats()
{
Offline.check(); // This returns Offline.state=up or down and it takes 1 seconds to complete.
if(Offline.state=="up")
{
return true;
}
else
{
return false;
}
}
var a = checkstats();
您可以使用异步JavaScript来解决这个问题。在JavaScript中有几种实现异步行为的方法。您可以使用回调、侦听器或承诺
无论如何,如果您确定只需要1秒,请在回调函数中设置Timeout,并允许脱机。check()
完成。(如果在那里实现异步是外部的或懒惰的)
理想情况下,您可以在脱机时设置回调函数。请检查,但我知道它是外部的,因此不起作用
您可以使用超时等待脱机。state
设置,但随后还需要异步执行涉及变量a
的任何操作:
function checkstats(callBack){ // checkstats() now takes a callback
Offline.check(); // Start Offline.check() as usual
setTimeout(function(){ // Set a timeout for 1 second
if(Offline.state=="up") // After 1 second, check Offline.state as usual
{
callBack(true); // ...but we call the callback instead of returning
}
else
{
callBack(false); // ...but we call the callback instead of returning
}
}, 1000);
}
checkstats(function(a){ // This anonymous function is the callback we're using
// Now you can use "a" normally
});
如果您不确定脱机.check()
将花费1秒的时间,您可以使用一个时间间隔而不是超时,然后每秒尝试一次,例如5秒:
function checkstats(callBack){
Offline.check();
var attempt = 0, maxAttempts = 5;
var checkStatsInterval = setInterval(function(){
if(++attempt > maxAttempts){
// Ran out of attempts, just give up
clearInterval(checkStatsInterval);
alert('Waited '+maxAttempts+' seconds for Offline data. Giving up!');
return;
}
if(Offline.state){
clearInterval(checkStatsInterval);
// It's loaded! Now confidently check Offline.state
if(Offline.state=="up")
{
callBack(true);
}
else
{
callBack(false);
}
}
}, 1000);
}
checkstats(function(a){
// Now you can use "a" normally
});
脱机.check()函数的作用是什么?那里有异步操作吗?最有可能的情况是,您必须为异步操作传递回调,并在callback.yea中实现其余代码。Offline.check()是外部js。。因此,我无法将回调添加到该异步。有其他方法解决此问题吗?也许可以调用offline.check(在html页面或加载的js文件上),将其余代码动态附加到脚本标记中。。
function checkstats(callBack){
Offline.check();
var attempt = 0, maxAttempts = 5;
var checkStatsInterval = setInterval(function(){
if(++attempt > maxAttempts){
// Ran out of attempts, just give up
clearInterval(checkStatsInterval);
alert('Waited '+maxAttempts+' seconds for Offline data. Giving up!');
return;
}
if(Offline.state){
clearInterval(checkStatsInterval);
// It's loaded! Now confidently check Offline.state
if(Offline.state=="up")
{
callBack(true);
}
else
{
callBack(false);
}
}
}, 1000);
}
checkstats(function(a){
// Now you can use "a" normally
});