在循环中调用Javascript回调

时间:2015-02-12 12:02:38

标签: javascript

我是一个javascript新手,已经遇到了问题需要解决,所以我真的需要你的帮助。

问题在于:

我有一个公司列表循环。对于每个公司,我需要像下面那样进行ajax调用。 我的问题是我想保持循环并获得ajax调用返回的值,所以我可以在那里使用该值。现在我得到getData方法的返回值。我该如何解决这个问题?

for (var j = 0; j < companiesToList.length; j = j + 1) {
    getCompanyData(companiesToList[j].id, numberArray, function(data){
      getData(data)
    }
}

var getCompanyData = function(companyid, numbers, callback) {       
    var baseUrl = '../data/financial/company/';
    baseUrl += companyid + '/';
    numbers = numbers.distinct();
    baseUrl += numbers.join(',');
    tiger.ajax.core.getJSON(baseUrl, null, function(data) {                     
        callback(data.financial);
    });
};

1 个答案:

答案 0 :(得分:0)

解决这个问题的一个好方法是使用promises,使用像kriskowal's Q这样的库(或任何其他实现promise API的接口):

for (var j = 0; j < companiesToList.length; j = j + 1) {
    getCompanyData(companiesToList[j].id, numberArray, function(data){
      getData(data).then(function(result) {
          // do something with result asynchronously
      }
    }
}

var getCompanyData = function(companyid, numbers, callback) {  
    // create a deferred object to return
    var deferred = Q.defer();

    var baseUrl = '../data/financial/company/';
    baseUrl += companyid + '/';
    numbers = numbers.distinct();
    baseUrl += numbers.join(',');
    tiger.ajax.core.getJSON(baseUrl, null, function(data) {  
        // resolve the promise with the retrieved data                   
        deferred.resolve(data.financial);
    });

    // return the unresolved promise immediately
    return deferred.promise;
};

上述内容是否适用于您的情况取决于结果返回后您在循环内需要做什么,因为如果您想要挑剔,那么实际上并不是留在循环,但使用then作为回调(如果你愿意)在检索结果后执行代码。话虽这么说,上述模式在很多这样的情况下运作良好。如果您提供有关数据需要处理的更多信息,我可以编辑我的答案。