簡體   English   中英

Javascript異步/等待for循環

[英]Javascript async/await in for loop

我有個問題

async function checkOk(listNotOkLocation) {
    // console.log(listNotOkLocation)
    var lenNotOk = listNotOkLocation.length
    if (lenNotOk == 0) return 'green'
    var latMarker = markerLocation.getPosition().lat()
    var lngMarker = markerLocation.getPosition().lng()
    var origin = latMarker.toString() + ", " + lngMarker.toString()

    for (var i = 0; i < lenNotOk; i++) {
        var lat = listNotOkLocation[i].lat
        var lng = listNotOkLocation[i].lng
        var destination = lat.toString() + ", " + lng.toString()
        calcRoute(origin,destination, function (err, dist) {
            console.log(1)
            if (!err) {        
                if (dist <= minDistance) 
                    return 'red'
            }
        });
    }
    console.log(2)
    return 'green'
}

for循環中的calcRoute函數需要時間,因此checkOk函數始終返回“綠色”。 有人可以幫我解決這個問題嗎?

將您的calcRoute包裝成可以返回承諾的內容

function calcRouteP(origin, destination) {
  return new Promise((resolve, reject) => {
    calcRoute(origin, destination, function (err, dist) {
      if (err) {
        reject(err);
      } else {
        resolve(dist);
      }
    });
  });
}

然后在異步功能中使用它

async function checkOk(listNotOkLocation) {
    // console.log(listNotOkLocation)
    var lenNotOk = listNotOkLocation.length
    if (lenNotOk == 0) return 'green'
    var latMarker = markerLocation.getPosition().lat()
    var lngMarker = markerLocation.getPosition().lng()
    var origin = latMarker.toString() + ", " + lngMarker.toString()

    for (var i = 0; i < lenNotOk; i++) {
        var lat = listNotOkLocation[i].lat
        var lng = listNotOkLocation[i].lng
        var destination = lat.toString() + ", " + lng.toString()
        var dist = await calcRouteP(origin,destination);
        if (dist <= minDistance) {
          return 'red'
        }
    }
    console.log(2)
    return 'green'
}

請注意,對於最后一個參數是傳遞了err, result的回調的函數err, result類似於calcRoute函數,通常會有庫為您包裝。 在node.js中,而不是自己包裝calcRoute您可以執行此操作

const util = require('util');
const calcRouteP = util.promisifiy(calcRoute);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM