Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.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 如何在Javscript中实现同步包装器?_Javascript_Jquery - Fatal编程技术网

Javascript 如何在Javscript中实现同步包装器?

Javascript 如何在Javscript中实现同步包装器?,javascript,jquery,Javascript,Jquery,我在Javascript中使用谷歌分析api 它们提供了一个获取列表结果的方法,一旦执行完成,它将使用结果调用回调方法 看起来像这样: gapi.client.analytics.management.accounts.list().execute(handleAccounts); 总的来说,这太棒了,但是。。。我需要一个所有子项的扁平列表,所以我一直这样打电话: $.each(results.items, function (index, value) { gapi.client.an

我在Javascript中使用谷歌分析api

它们提供了一个获取列表结果的方法,一旦执行完成,它将使用结果调用回调方法

看起来像这样:

gapi.client.analytics.management.accounts.list().execute(handleAccounts);

总的来说,这太棒了,但是。。。我需要一个所有子项的扁平列表,所以我一直这样打电话:

 $.each(results.items, function (index, value) {

gapi.client.analytics.management.webproperties.list({ 'accountId': value.Id}).execute(handleWebproperties);
// and so on..
            })
var queryFunctions = []
$.each(results.items, function (index, value) {
    queryFunctions.push(function(callback){
        gapi.client.analytics.management.
            webproperties.list({ 'accountId': value.Id}).
            execute(callback);
    });
})

fork(queryFunctions,function(result){
    // This is the final callback, so do processing here
})
问题是,如果在任何级别上,您有多个项目,那么最终会出现多个异步调用,我不知道它们何时完成以获得最终列表

除了写一些东西来记录打了多少个电话,然后等待总数回来

我怎么能轻易知道他们什么时候都完成了

谢谢

总之:

用户可以有多个帐户,帐户可以有多个属性,属性可以有多个配置文件


我需要一个用户的所有帐户的所有配置文件。

解决这个问题的方法是跟踪您已经(或将要)进行的异步调用的数量,以及在每个响应中您收到的计数递减,并检查最后一个是否已完成。确保在一个响应生成错误并且无法成功完成时,具有健壮的错误处理非常重要


你似乎知道这是一个选择,也不清楚你为什么不追求这个,但这是解决这个问题的方法。它也可能用于跟踪最后一个完成的时间,但这只是使用一个库来为您计数-它的基本原理仍然是一样的。

基于我的
fork
函数,我写了这个函数作为前面的答案:。我会这样做:

 $.each(results.items, function (index, value) {

gapi.client.analytics.management.webproperties.list({ 'accountId': value.Id}).execute(handleWebproperties);
// and so on..
            })
var queryFunctions = []
$.each(results.items, function (index, value) {
    queryFunctions.push(function(callback){
        gapi.client.analytics.management.
            webproperties.list({ 'accountId': value.Id}).
            execute(callback);
    });
})

fork(queryFunctions,function(result){
    // This is the final callback, so do processing here
})
fork
的实现很简单:

function fork (async_calls, shared_callback) {
  var counter = async_calls.length;
  var all_results = [];
  function makeCallback (index) {
    return function () {
      counter --;
      var results = [];
      // we use the arguments object here because some callbacks 
      // in Node pass in multiple arguments as result.
      for (var i=0;i<arguments.length;i++) {
        results.push(arguments[i]);
      }
      all_results[index] = results;
      if (counter == 0) {
        shared_callback(all_results);
      }
    }
  }

  for (var i=0;i<async_calls.length;i++) {
    async_calls[i](makeCallback(i));
  }
}
函数分叉(异步调用、共享回调){
var counter=async_calls.length;
var all_结果=[];
函数makeCallback(索引){
返回函数(){
计数器--;
var结果=[];
//我们在这里使用arguments对象,因为有些回调
//在节点中作为结果传入多个参数。
对于(var i=0;i您可以使用这些特性来完成这类工作。基本上,如果您将回调封装在一个延迟对象中,则使用将它们全部分组在一起

类似这样的情况(对您最有意义的确切结构将取决于您如何使用它,此代码假定您需要在每个回调中执行特定的操作,并知道何时完成这些操作):


注意:我只是直接在浏览器窗口中编码,因此这可能不是100%正常工作。:)

是的,我只是觉得应该有一种更简单的方法来做这件事?或者是一个JQuery组件,或者是一些可以为我把它包装得很整齐的东西?@shenku-正如我在我的答案中添加的,如果你愿意使用库来为你记录这件事,你可以使用它。请参见:@shenku-你使用JQuery(v1.5或更高版本)?不用担心,jquery只是没有快速加载,现在将实现并让您知道它是如何运行的……我唯一的问题是,当遇到该语句时,“when.apply”总是被执行,即使有未解决的承诺?@shenku-将立即调用
when.apply
,但jquery不会调用
。完成(function(){…});
直到所有承诺都得到解决。done会立即被调用,可能是因为我期望的所有承诺都还没有到达数组?请看这里的代码,我已经消除了噪音。。。