我有全局变量var distances = []
。我有功能来填补它,但需要一些时间。我想在填充后将其发送到Django视图。但是由于JS异步工作,我总是发送空数组。如何在不设置超时的情况下发送填充数组?我的js代码是
var distances = [] //array where some digits will be stored
function getAllDistances() //function where this digits being put in distances arr
//note that every digit is result of request to API of routing service so it takes
//some time to get thing done
function ajaxTest(){//function for sending array to Django view
$.ajax({
url:'test/',
type:'POST',
data:JSON.stringify({distances : distances}),
dataType: 'json',
success:function (data) {
console.log("Ajax test success");
console.log(data.result.text);//view should return some result
},
error:function () {
console.log("Ajax test failure")
}
})
}
function doTheJob(){ //main function
getAllDistances();
ajaxTest();
}
所以请求一切正常,但总是发送空数组。是否可以让js发送填充数组而不设置超时?我想回调可以在这里起作用,但是如果我错了,可以纠正我
为了更清楚一点,我将添加可以获取距离的函数
function getRoutSummary(i, j, q) {
var url = 'https://router.project-osrm.org/route/v1/driving/' +
coords[i][1] + ',' + coords[i][0] + ';' +
coords[j][1] + ',' + coords[j][0] +
'?geometries=geojson';
//coord is array of arrays with coordinates like
//[[lat1, long1], [lat2, long2], [lat3, long3]] where lat is latitude and long
//is longtitude
var req = new XMLHttpRequest();
req.responseType = 'json';
req.open('GET', url, true);
req.onload = function () {
var jsonResponse = req.response;
var distance = jsonResponse.routes[0].distance;
distances[q] = distance;
};
req.send();
}
然后我循环调用此函数
function getAllDistances(){
var q = 0;
for (var i = 0; i < coords.length; i++){
for (var j = 0; j < coords.length; j++){
getRoutSummary(i, j, q);
q = q + 1;
}
}
console.log(distances);
}
答案 0 :(得分:3)
将promises与Promise.all()
一起使用
distancePromise = [];
function getAllDistances() {
//a loop
var promise = getSingleDistance();
distancePromise.push(promise);
//return a array of promises
return distancePromise
}
//send the distances after all the promises have been resolved
Promise.all(distancePromise).then(function(distances) {
//save the distances
})