Javascript 内部For循环的异步承诺
我希望每次都能得到一条路线,如果inside for loop为真的话 如果按预期点击${j},则显示Javascript 内部For循环的异步承诺,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,我希望每次都能得到一条路线,如果inside for loop为真的话 如果按预期点击${j},则显示,然后触发getSinglePart(partPath),按预期显示log1,然后返回res到getSinglePart(partPath)。然后在log1之后立即返回(res) 但是getSinglePart()。然后((res))在for循环结束后立即显示所有路由 为什么即使它回报了一个承诺?如何解决这个问题 提前感谢:) 函数getSinglePart(partPath){ 返回新承诺((
,然后触发getSinglePart(partPath)
,按预期显示log1
,然后返回res
到getSinglePart(partPath)。然后在log1
之后立即返回(res)
但是getSinglePart()。然后((res))
在for循环结束后立即显示所有路由
为什么即使它回报了一个承诺?如何解决这个问题
提前感谢:)
函数getSinglePart(partPath){
返回新承诺((解决、拒绝)=>{
console.log('log1');
让tempDirectionsService=new google.maps.DirectionsService;
让templevationservice=new google.maps.ElevationService;
让tempDirectionsRenderer=new google.maps.DirectionsRenderer({draggable:true,map:store.getState().map});
tempDirectionsService.route({
原点:零件路径[0],
//航路点:航路点雷达,
目标:partPath[partPath.length-1],
travelMode:“步行”,
避免收费:正确
},(分辨率、状态)=>{
决议(res);
});
});}
函数getParts(响应){
设距离=[];
让legs=响应。路由[0]。legs;
对于(让i=0;i来说,所描述的行为似乎是正确的,因为您实际上是在计划异步处理一组“tempDirectionsService.route”函数,然后退出循环,然后等待“tempDirectionsService.route”完成(每个“then”都会被打印出来,因为每个“tempDirectionsService.route”都是完整的,没有特定的顺序,可能在循环期间,也可能在循环之后)。如果您的目标是等待当前计划的“tempDirectionsService.route”完成,然后再继续循环的下一次迭代,则必须相应地重写循环。例如:
循环不会等待承诺?@Bergi nope,它有自己的生命:D我将尝试阅读下面评论中的链接;)您可能还想详细说明您试图完成的内容。也许,您实际上不需要等待每次迭代完成,只需在循环之外进行处理即可。@Maksym是的,我想我最终会完全按照您所说的去做。我甚至早就想过了,但想通过这种方式解决它。谢谢您的帮助tho:)
function getSinglePart(partPath){
return new Promise((resolve, reject) => {
console.log('log 1');
let tempDirectionsService = new google.maps.DirectionsService;
let tempElevationService = new google.maps.ElevationService;
let tempDirectionsRenderer = new google.maps.DirectionsRenderer({draggable: true, map: store.getState().map});
tempDirectionsService.route({
origin: partPath[0],
//waypoints: waypointsArray,
destination: partPath[partPath.length-1],
travelMode: 'WALKING',
avoidTolls: true
}, (res, status) => {
resolve(res);
});
});}
function getParts(response){
let distances = [];
let legs = response.routes[0].legs;
for(let i=0; i<legs.length; i++){
let steps = legs[i].steps;
let distanceCounter = 0;
let partsCounter = 0;
let startNextIndexes = [0];
for(let j=0; j<steps.length; j++){
distances.push(steps[j].distance.value);
distanceCounter += steps[j].distance.value;
if(distanceCounter > 100000 || j === steps.length-1){
startNextIndexes.push(j+1);
let partPath = [];
distanceCounter = 0;
console.log(`if HIT ${j}`);
for(let k=startNextIndexes[partsCounter]; k<=j; k++){
for(let l=0; l<steps[k].path.length; l++){
partPath.push(steps[k].path[l]);
}
}
getSinglePart(partPath).then((res) => {
console.log('then');
console.log(res);
});
}
}
}}