级联调用函数jQuery

时间:2017-12-15 02:06:18

标签: javascript jquery

我想调用如下所示的函数

getValueListDataWithScol1(1029).done(function (kvalue) {
  konto = kvalue;
  getValueListDataWithScol1(1033).done(function (mvalue) {
    mws = mvalue;
    getValueListDataWithScol1(1101).done(function (wvalue) {
      wirt = wvalue;
      LoadStaticData();
      LoadGridData();
    });
  });
});

但它是硬编码我想根据数组中的值动态地进行操作。例如,这里的三级if数组有4个元素应该添加另一个级别,在最后的调用中应该调用两个函数。我不知道如何实现它。这背后的原因是我需要加载函数和getValueListDataWithScol1中被调用函数的值基本上是回调函数

我尝试这样做,但功能没有等待异步调用,我知道我不应该,但如何让它等待。我无法将呼叫更改为同步。

function loaddata(ids) {
  var d = new $.Deferred();
  for (var key in ids) {
    getValueListDataWithScol1(ids[key]).done(function (value) {
      lists[ids[key]] = value;
    });  
    delete ids[key];
    loaddata(ids)
  }
  d.resolve(lists);
  return d.promise();
}

1 个答案:

答案 0 :(得分:2)

由于您的请求似乎并不相互依赖,因此您可以映射一组请求,并在解决所有请求时使用$.when运行。

$.when.then中的参数与原始数组

的顺序相同



var array = [5,2,6,4];

var promiseArrray= array.map(function(num, i){
    console.log('Start request #' , i+1)
    return dummyRequest(num).then(function(res){
          console.log('End request #' , i+1)
          return {num: num, res: res}
    });
});

$.when.apply(null, promiseArrray).then(function(){
   var allResults = [].slice.call(arguments);
   processFinalResults(allResults);

});

function processFinalResults(arr){
   console.log('final results:');
   console.log(JSON.stringify(arr));
}

function dummyRequest(num){
   var promise = $.Deferred();
      setTimeout(function(){
         promise.resolve(num * 100);
      }, num * 200);// alternate delay to shuffle completion order of fake requests 
   return promise;
}

.as-console-wrapper {max-height: 100%!important;}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;