Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 在node.js中返回延迟的嵌套承诺_Javascript_Node.js_Promise_Settimeout_Q - Fatal编程技术网

Javascript 在node.js中返回延迟的嵌套承诺

Javascript 在node.js中返回延迟的嵌套承诺,javascript,node.js,promise,settimeout,q,Javascript,Node.js,Promise,Settimeout,Q,我在代码中使用谷歌地理编码。我得给大约50个地方编地理编码, 但谷歌不允许在同一时间对这么多地方进行地理编码,从而产生“超过查询限制”的错误。 因此,当我超过配额时,我想将地理编码延迟几秒钟。 我有一个函数geocode(),它返回一个promise。当我超过配额时,我想递归地调用它自己 这是我的非工作代码: function geocodeAll(addresses) { for (addr in addresses) { geocode(addresses[ad

我在代码中使用谷歌地理编码。我得给大约50个地方编地理编码, 但谷歌不允许在同一时间对这么多地方进行地理编码,从而产生“超过查询限制”的错误。 因此,当我超过配额时,我想将地理编码延迟几秒钟。 我有一个函数
geocode()
,它返回一个
promise
。当我超过配额时,我想递归地调用它自己

这是我的非工作代码:

function geocodeAll(addresses)
 {
   for (addr in addresses)
     {
      geocode(addresses[addr])
        .then(
              function(coord)
               {/* I don't always get here */}
             )
     }
 }


function geocode(address)
{
 var deferred = Q.defer();
 geocoder.geocode(address, function ( err, geoData ) 
        {
         if (err)
            { deferred.reject(err);}
         else
            {
             if (geoData.status=="OVER_QUERY_LIMIT" )
                 { // doh! quota exceeded, delay the promise
                  setTimeout(function()
                     {geocode(address)
                      .then(
                            function(coord)
                             {deferred.resolve(coord);}
                           );
                      }, 1000);
                    }
                else
                    { // everything ok
                     var coord = {'lat':geoData.lat, 'lng':geoData.lng};              
                     deferred.resolve(coord);
                    }
               }
      });

  return deferred.promise; 
}
更新[已解决]


实际上,代码是正确的。我有一个与延误无关的意外情况。使用
Q.all([…]).then().catch()
我发现代码看起来不错。可能是
geocoder.geocode
或其他错误。尝试设置:

window.onerror = (err) => console.error(err)
或:


您的代码似乎工作正常。我看到您的代码的唯一问题是您使用的
lat
lng
超出范围。但是,您可能已经正确地编写了这些代码,只是没有包含这些代码。不过我怀疑你可能错误地使用了这两个。应该是
geoData.lat
geoData.lng

var-coord={'lat':geoData.lat,'lng':geoData.lng}

编辑

我认为您的问题可能与
geocodeAll
函数实现有关

function geocodeAll(addresses)
 {
   for (addr in addresses)
     {
      geocode(addresses[addr]) /* This seems error prone to me!  Try keeping track of all your promises.*/
        .then(
              function(coord)
               {/*You only get here if there was no error returned from the geo request to the api. */}
             )
     }
 }
使用
Q.all
跟踪

function geocodeAll(addresses) {
  var promises = addresses.map(geocode); 
  for (addr in addresses) {
    promises.push(
      geocode(addresses[addr])
         .catch(console.log.bind(console)) /* handle your error however you see fit*/
      ); 
  }
  return Q.all(promises).then(function(results) {
     var firstCord = results[0];
     var secondCord = results[1];
     //etc...
  });
 }
或者您还可以使用
Q.allselled

function geocodeAll(addresses) {
      var promises = addresses.map(geocode);
      return Q.allSettled(promises).then(function (results) {
        var success = [], fail = [];
        results.forEach(function (result) {
          if (result.state === "fulfilled") {
             success.push(result.value);
          } else {
            fail.push(result.reason);
          }
        });
        return { coords: success, errors: fail };
      });
     }

   });

是你的承诺永远无法解决,还是你得到了一个错误?我总是得到地理编码的结果,但它不会第一次返回到主函数geocode()。你不会在任何地方处理错误。你怎么知道你没有得到它们中的一个?你怎么知道当结果没有返回时你总是得到结果?试着避免这种情况,而是自己承诺
geocode
setTimeout
。如果您不想这样做,至少可以使用
setTimeout(function(){deferred.resolve(geocode(address));},1000)
来正确地执行。是的,这里只是一个输入错误。这在我的真实代码中是正确的。谢谢,我解决了这个问题谢谢,你的代码更干净了!现在它可以工作了,这是一个未被捕获的例外,您实际上正在查找
process.on(“unhandledrefraction”,console.error)
function geocodeAll(addresses) {
      var promises = addresses.map(geocode);
      return Q.allSettled(promises).then(function (results) {
        var success = [], fail = [];
        results.forEach(function (result) {
          if (result.state === "fulfilled") {
             success.push(result.value);
          } else {
            fail.push(result.reason);
          }
        });
        return { coords: success, errors: fail };
      });
     }

   });