繁体   English   中英

For循环内部的异步承诺

[英]Async Promises Inside For Loop

如果内部for循环为true,我想每次获取一条路由。

它显示if HIT ${j}如预期的那样if HIT ${j} ,然后getSinglePart(partPath) ,按预期显示log 1 ,然后应该在log 1之后立即将res返回到getSinglePart(partPath).then(res)

但是getSinglePart().then((res))在for循环结束后立即显示所有路由!

为什么即使它返回了承诺? 以及如何解决?

提前致谢 :)

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);
            });
        }
    }
}}

所描述的behaivor似乎是正确的,因为您实际上是在计划一堆“ tempDirectionsService.route”函数以进行异步处理,然后退出循环,然后等待“ tempDirectionsService.route”完成(每个“ then”在每个“ tempDirectionsService.route”完成时打印(没有特定顺序,可以在循环期间也可以在循环之后)。 如果您的目标是等待当前计划的“ tempDirectionsService.route”完成,然后再进行循环的下一个迭代,则必须相应地重写循环。 例如:

JavaScript ES6承诺循环

正确编写承诺循环的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM