Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 变量的setInterval/setTimeout检查值_Javascript_Settimeout_Setinterval - Fatal编程技术网

Javascript 变量的setInterval/setTimeout检查值

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 }); 我想对它们都执行操作,所以要做到这一点,两个

我正在编写一些javascript,它依赖于一些异步方法调用

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您能详细说明一下吗?