如何知道哪个$ .ajax承诺已经解决?

我正在使用jQuery ajax来请求数据,然后将其制作成不同类型的图表或表格。

我将我想要运行的查询放入一个对象并发送请求。 runQuery()返回一个jQuery promise。 承诺完成后返回的数据是正确的。 [ 编辑 ]由于ajax请求是异步运行的,它们可能不会按它们发出的顺序[ / EDIT ]返回,我无法知道返回数据的查询位置。

function refreshData(){ for(var key in baseQueries){ runQuery(baseQueries[key]) .done(function(data){ console.log("Query data for "+key); // want to call different charting functions // based upon which results are returned }); } }; runQuery(obj) { // "public" function var params = $.extend({},defaults,obj); return sendRequest(queryUrl,params) } sendRequest(url,data,method){ // "private" function method = method || "GET"; return $.ajax({ type:method, url:url, dataType:"json", data:data }) .fail(function(error){ console.log(error); }); } 

在这种情况下,控制台在baseQueries对象的最后一次迭代中记录key的值。 例如,如果我的baseQueries对象中有三个项目,那么我的baseQueries对象中的最后一项是

 "This-is-the-last-query":"queryparam1,queryparam2,etc" 

然后,当所有三个ajax调用解析时,我得到三个“这是最后查询”的日志。 这没有用,因为它没有告诉我数据属于哪个查询。

这类似于臭名昭着的javascript循环问题的想法,但我真的没有看到如何在这里使用将值附加到DOM元素的答案。

如何匹配哪个查询调用与哪个承诺? 如何通过ajax调用传递密钥并使用promise数据返回它。

编辑不要认为这是指示的线程的副本。 我看到它们是如何相关的,但不是如何使用它来解决这个问题。 建议的重复没有提到jquery,ajax,promises或异步问题。 它也被标记为另一个没有提及任何这些东西的线程的副本。

显示的解决方案要么使用dom元素来保存onclick所需的信息(这里不适用),要么添加一个闭包,但是当已经返回数据时我不知道如何做到这一点。

如果你传递jQuery ajax一个它一无所知的参数,它就会忽略它,你以后可以访问它。

在这里,我们为您的额外值(mykey)设置一个参数,然后我们可以在以后为我们正在使用的实例访问它:

 function refreshData() { for (var key in baseQueries) { runQuery(baseQueries[key], key) .done(function(data) { console.log("Query data for " + this.myKey); // "this" here is the ajax for which the promise (ajax) gets resolved, // and we return that promise so it works here. // want to call different charting functions // based upon which results are returned }); } }; runQuery(obj,key) { // "public" function var params = $.extend({}, defaults, obj); return sendRequest(queryUrl, params,,key) } sendRequest(url, data, method, key) { // "private" function method = method || "GET"; return $.ajax({ type: method, url: url, dataType: "json", data: data, myKey:key }) .fail(function(error) { console.log(error); }); } 

如果你想检查jquery promise是否已经解决,你可以使用jqueryPromise.state()来检查,它根据状态返回pending , resolve或reject 。
如果您要发送多个ajax requests并且想知道它们何时完成,您可以将它们放入数组( [$.ajax(...),$.ajax(...)] )并将其传递给$ .when喜欢

 var requests = [$.ajax(...),$.ajax(...)]; $.when.apply($, requests).done(function() { console.log('all requests completed'); }); 

如果你想建立一些复杂的承诺,我会建议使用蓝鸟或不太复杂的rsvp