在循环中调用Javascript回调

在循环中调用Javascript回调,javascript,Javascript,我是一个javascript新手,有一个问题需要解决,所以我真的需要你的帮助 问题是: 我有一个循环的公司名单。对于每家公司,我都需要进行如下的ajax调用。 我的问题是,我想留在循环中,只获取ajax调用返回的值,以便在那里使用该值。现在我得到了getData方法的返回值。我怎样才能解决这个问题 for (var j = 0; j < companiesToList.length; j = j + 1) { getCompanyData(companiesToList[j].id

我是一个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);
    });
};

解决此问题的一个好方法是使用Promission,使用类库或任何其他实现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作为回调函数(如果您希望在检索结果后执行代码)。也就是说,上述模式在很多情况下都能很好地工作。如果您提供了有关如何处理数据的更多信息,我可以编辑我的答案。

您是否尝试过同步ajax?只需考虑到ur循环可能需要一段时间,因为它只有在有响应时才会继续received@dav我希望这不是你的意思,但永远不要使用同步AJAX调用。学习如何处理异步代码。@MaxArt,是的,我想说synchronousedid,我同意你的观点,但在极少数情况下它可能有用。