我如何知道最后一个异步函数何时在ob" for键中返回结果?循环
How do I know when the last asynchronous function has returned results in the "for key in ob" loop?
我有下面的代码来遍历一个对象:
var data = [];
var obj = {...
};
for (var key in obj) {
if (!obj[key]["something"]) {
geocoder.geocode({
'address': key
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
data.push({...});
}
});
// if last item
$.post("...", data, ...);
}
}
现在我想发布通过运行循环中调用的所有异步函数获取的所有数据。
由于geocoder.geocode()
(这是Google Maps API的一部分)不返回Promise
或Deferred
,您必须将请求封装在您自己的Promise
中,然后使用Promise.all()
:
var promises = [];
for (var key in obj) {
if (!obj[key]["something"]) {
promises.push(new Promise(function (resolveWith, rejectWith) {
geocoder.geocode({
'address': key
}, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
data.push(...);
resolveWith(results);
} else
rejectWith(results);
});
}));
}
}
Promise.all(promises).then(function (resultsArr) {
// at this point all requests have been fulfilled
$.post(...);
});
看到MDN
尝试使用jQuery.Deferred()
var obj = {...};
var deferred = $.Deferred();
deferred.done(function(){ /*.. asynchronous function here ..*/ });
for (var key in obj) {
if (!obj[key]["something"]) {
deferred.resolve();
}
}
您需要知道哪个键是最后一个,但由于对象中散列键没有确定的顺序,因此在边缘情况下很可能不会出现您想要的结果。
至少获得某种最后键的一种方法是在主循环之前迭代一次,如下所示:
var obj = {...
};
var lastkey;
for (var key in obj) {
lastkey = key;
}
for (var key in obj) {
if( key === lastkey) {
... do lastkey stuff instead here
} else {
if (!obj[key]["something"]) {
geocoder.geocode({
'address': key
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
...
}
});
}
}
}
如果'obj'在这两个循环期间或之间没有改变,那么最后一个键在两个循环中应该是相同的。
var data = [];
var obj = {...
};
var keys = Object.keys(obj);
var last = keys[keys.length-1];
for (var key in obj) {
if (!obj[key]["something"]) {
geocoder.geocode({
'address': key
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
data.push({...});
}
});
// if last item
if (key == last)
$.post("...", data, ...);
}
}
相关文章:
- 使用for循环从Javascript中的函数返回多个值
- 如何使for循环等待回调返回值
- 在for循环之后返回一个值
- 使用函数for循环遍历对象以更改值,然后返回结果
- hasOwnProperty在For in循环中总是返回False
- Why For-in循环返回'arg'当循环为空时
- 从 Javascript 中的 'for' 循环返回所有值
- 返回实例'for循环中的id
- For循环以错误的顺序返回promise
- angular for循环返回最后一个值
- 将for循环从完成延迟到返回API调用
- 从包含在for循环中的递归返回值的正确方式
- node.js for循环在函数调用返回之前进行迭代,从而产生对象问题
- 从 for 循环内的 AJAX 链中的最后一个 AJAX 请求返回值
- 使用 jQuery 创建动态元素 单击事件始终返回 for 循环中的最后一个索引
- 如何每次从 for 循环返回值
- For 循环成功地将元素添加到数组中,但在之后返回空数组
- 返回 for 循环中对象中每个键的值
- 为什么这是 for 循环返回字符的索引而不是整个属性
- 为什么"for (i=0;i==x;i++)"返回未定义