Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 内部For循环的异步承诺_Javascript_Asynchronous_Es6 Promise - Fatal编程技术网

Javascript 内部For循环的异步承诺

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){ 返回新承诺((

我希望每次都能得到一条路线,如果inside for loop为真的话

如果按预期点击${j},则显示
,然后触发
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);
            });
        }
    }
}}