为啥我不能在函数中返回计算出的距离(来自 Google Maps API)? [复制]

Posted

技术标签:

【中文标题】为啥我不能在函数中返回计算出的距离(来自 Google Maps API)? [复制]【英文标题】:Why can't I return the calculated distance (from Google Maps API) in a function? [duplicate]为什么我不能在函数中返回计算出的距离(来自 Google Maps API)? [复制] 【发布时间】:2021-01-11 10:14:45 【问题描述】:

我一直在尝试编写一个程序,该程序最终将获取一组距离并将它们输入到一个数组中。通过我附加的代码,我找到了两个位置之间的距离,我可以将该距离放入控制台日志中——我只是无法在该函数中返回它。我已经尝试使用 async/await 和 Promises 来尝试将其从函数中取出,但这会导致数组包含已履行的 Promise,但是数据是“未定义的”(在下面的代码中,我删除了 async await 实现) .请告知我如何返回此距离值并最终将其放入数组中。

function getDistances(directionsService, destination)

    var route = origin: document.getElementById("Address").value, // User input for their address
      destination: destination,
      travelMode: 'DRIVING'

    directionsService.route(route, // Request for a route
    function(response, status)  
      if (status !== 'OK') 
        window.alert('Directions request failed due to status error: ' + status);
        return;
       
      else 
        var directionsData = response.routes[0].legs[0]; // Get data about the mapped route
        if (!directionsData) 
          window.alert('Directions request failed');
          return;
        
        else 
            
            var currentDist = directionsData.distance.value;
            return currentDist; // When this is returned, it's always undefined

函数 getDistances(directionsService, 目的地)

【问题讨论】:

你没有在function getDistances 中返回任何东西——你提到了承诺,但你的代码没有使用承诺......无论哪种方式,你永远无法从@987654323 返回任何直接有用的东西@ 因为来自 directionsService.route 的结果是异步的 - 你可以从 getDistances 返回一个在 directionsService.route 回调中解析的 Promise 【参考方案1】:

如果你想使用 Promise - 然后返回一个 Promise,你可以从 getDistances 返回一个在 directionsService.route 回调中解析的 Promise

类似

function getDistances(directionsService, destination) 
    return new Promise(function (resolve, reject) 
        var route = 
            origin: document.getElementById("Address").value, // User input for their address
            destination: destination,
            travelMode: 'DRIVING'
        

        directionsService.route(route, function (response, status) 
            if (status !== 'OK') 
                reject( response, status, reason: 'Directions request failed due to status error' );
             else 
                var directionsData = response.routes[0].legs[0]; // Get data about the mapped route
                if (!directionsData) 
                    reject( response, status, reason: 'Directions request failed' );
                 else 
                    resolve(directionsData.distance.value);
                
            
        );
    );

但是,这假设 directionsService.route 回调仅被调用一次(您在问题中提到了 Array,所以...不确定您的代码中哪里有 Array)

【讨论】:

这行得通,谢谢!现在我正在尝试访问返回的 Promise 中的值。我该怎么做?我有一系列这些承诺,并希望找到距离最短的元素。当我尝试排序和执行操作时,它不起作用,因为数组中的不是数字。有没有办法只访问 Promise 中的值?谢谢。 @Jackson - 与任何 Promise 一样 ....thenawait

以上是关于为啥我不能在函数中返回计算出的距离(来自 Google Maps API)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JPA - 映射来自实体的附加计算值

尝试编写最近邻算法 - 欧几里得距离函数只计算测试集的一行的距离 - 为啥?

为啥我不能用开关检查函数的返回?

为啥循环在这里比索引好?

为啥我的受 AAD 保护的 Azure 函数在使用来自 UWP 应用的访问令牌调用时返回 401?

为啥我们不能直接从函数返回一个 mysqli 对象?对象必须先存储在变量中吗?