Javascript 变量的setInterval/setTimeout检查值
我正在编写一些javascript,它依赖于一些异步方法调用Javascript 变量的setInterval/setTimeout检查值,javascript,settimeout,setinterval,Javascript,Settimeout,Setinterval,我正在编写一些javascript,它依赖于一些异步方法调用 var one = asyncCall(); var two = differentAsyncCall(); 我知道我可以像这样处理它们的任何一个返回值 var one = asyncCall(function(results){ //do stuff }); var two = differentAsyncCall(function(results){ //do more }); 我想对它们都执行操作,所以要做到这一点,两个
var one = asyncCall();
var two = differentAsyncCall();
我知道我可以像这样处理它们的任何一个返回值
var one = asyncCall(function(results){
//do stuff
});
var two = differentAsyncCall(function(results){
//do more
});
我想对它们都执行操作,所以要做到这一点,两个异步调用都必须完成。我知道我可以做一些事情,比如:
asyncCall(function(results){
var firstReturn = results;
differentAsyncCall(function(results2){
var secondReturn = results2;
//do stuff now that they're both defined.
});
});
var one = asyncCall(function(results){
return results;
});
var two = differentAsyncCall(function(results){
return results;
});
window.setInterval(function(){
if( one && two){
//do stuff now that they're defined
//remove the timer
}
},250);
我很好奇是否有一种方法可以使用setInterval或setTimeout执行以下操作:
asyncCall(function(results){
var firstReturn = results;
differentAsyncCall(function(results2){
var secondReturn = results2;
//do stuff now that they're both defined.
});
});
var one = asyncCall(function(results){
return results;
});
var two = differentAsyncCall(function(results){
return results;
});
window.setInterval(function(){
if( one && two){
//do stuff now that they're defined
//remove the timer
}
},250);
这是一个叫做承诺的概念,可以在这里使用。承诺是延迟对象概念的一部分 其思想是将异步调用分配给两个变量。当这两个变量都可用时,然后采取一些行动,这就是您正在尝试做的 我使用了jQuery版本,其文档可以在这里找到。
这很容易理解。我不知道如何在纯Javascript中实现这一点。您最好使用任何异步库这是一个称为Promises的概念,可以在这里使用。承诺是延迟对象概念的一部分 其思想是将异步调用分配给两个变量。当这两个变量都可用时,然后采取一些行动,这就是您正在尝试做的 我使用了jQuery版本,其文档可以在这里找到。
这很容易理解。我不知道如何在纯Javascript中实现这一点。您最好使用任何异步库这是一个很好的使用承诺/延迟的用例,但这是另一个概念,需要包括一个库(至少目前是这样) 当您使用纯javascript(无库)时,您可以在某处添加此简单的帮助器方法:
function whenAll(promises, doneProperty, callback){
promises[doneProperty] = true;
for(var key in promises)
if(promises[key] == false) return false;
if(callback) callback();
return true;
}
(以下示例包含3个需要完成的异步调用)
然后你会做:
//This object contains all the async calls needed to be completed, key is the name
var promises = {"asyncCall1": false, "asyncCall2": false, "asyncCall3": false};
//And the magic comes here:
var results1, results2, results3; //These will contain the results
(function(whenAllCallback){
asyncCall1(function(results){
results1 = results;
whenAll(promises, "asyncCall1", whenAllCallback);
});
asyncCall2(function(results){
results2 = results;
whenAll(promises, "asyncCall2", whenAllCallback);
});
asyncCall3(function(results){
results3 = results;
whenAll(promises, "asyncCall3", whenAllCallback);
});
})(function(){
//This executes when all calls have been completed
alert(results1);
alert(results2);
alert(results3);
});
请注意,这3个异步调用可以以任何顺序结束,并且回调将在所有调用完成后执行
这种语法在一开始可能很难,但一旦你习惯了,它就会变得很容易。在做出真正的承诺之前,您可以使用此代码
干杯,来自玻利维亚拉巴斯这是使用承诺/延期的一个极好的用例,但这是另一个概念,需要包括一个库(至少现在是这样) 当您使用纯javascript(无库)时,您可以在某处添加此简单的帮助器方法:
function whenAll(promises, doneProperty, callback){
promises[doneProperty] = true;
for(var key in promises)
if(promises[key] == false) return false;
if(callback) callback();
return true;
}
(以下示例包含3个需要完成的异步调用)
然后你会做:
//This object contains all the async calls needed to be completed, key is the name
var promises = {"asyncCall1": false, "asyncCall2": false, "asyncCall3": false};
//And the magic comes here:
var results1, results2, results3; //These will contain the results
(function(whenAllCallback){
asyncCall1(function(results){
results1 = results;
whenAll(promises, "asyncCall1", whenAllCallback);
});
asyncCall2(function(results){
results2 = results;
whenAll(promises, "asyncCall2", whenAllCallback);
});
asyncCall3(function(results){
results3 = results;
whenAll(promises, "asyncCall3", whenAllCallback);
});
})(function(){
//This executes when all calls have been completed
alert(results1);
alert(results2);
alert(results3);
});
请注意,这3个异步调用可以以任何顺序结束,并且回调将在所有调用完成后执行
这种语法在一开始可能很难,但一旦你习惯了,它就会变得很容易。在做出真正的承诺之前,您可以使用此代码
干杯,来自玻利维亚拉巴斯我先前答案的另一个版本,它在最终回调中接受返回值作为参数,并使用promises数组而不是object(更简单): jsfiddle:
Cheers我上一个答案的另一个版本,它在最终回调中接受返回值作为参数,并使用promises数组而不是object(更简单): jsfiddle:
Cheers使用
setInterval
或setTimeout
来击败异步调用是不可靠的。我强烈推荐使用奇妙的异步库来处理类似的事情。特别是async.parallel方法。您的asyncCall()
函数是否实际返回值?您的计时器/间隔示例在回调函数中有返回结果
,但是asyncCall()
对该返回值做了什么吗?@您能详细说明一下吗?使用setInterval
或setTimeout
来击败异步调用,不可靠。我强烈推荐使用出色的异步库来处理类似的事情。特别是async.parallel方法。您的asyncCall()
函数是否实际返回值?您的计时器/间隔示例在回调函数中有返回结果
,但是asyncCall()
对该返回值做了什么吗?@thefourtheye您能详细说明一下吗?