Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.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 节点JS承诺的问题_Javascript_Node.js - Fatal编程技术网

Javascript 节点JS承诺的问题

Javascript 节点JS承诺的问题,javascript,node.js,Javascript,Node.js,我无法找到一个解决方案,来解释为什么在使用必要的值更新消息数组之前该函数返回 var calculateInstance=函数(消息、克隆、类别、会话ID){ 返回新承诺(功能(解决、拒绝){ distance.key=options.apiKey; 距离。单位(“公制”); var来源=[]; 推(cLatitude+','+cLongitude); message.forEach(功能(obj){ obj.sessionId=cssessionid; var目的地=[]; destinat

我无法找到一个解决方案,来解释为什么在使用必要的值更新消息数组之前该函数返回

var calculateInstance=函数(消息、克隆、类别、会话ID){
返回新承诺(功能(解决、拒绝){
distance.key=options.apiKey;
距离。单位(“公制”);
var来源=[];
推(cLatitude+','+cLongitude);
message.forEach(功能(obj){
obj.sessionId=cssessionid;
var目的地=[];
destinations.push(obj.geoLocation.latitude+','+obj.geoLocation.longitude);
距离矩阵(起点、目的地、功能(错误、距离){
如果(错误){
返回console.log(err);
}
如果(!距离){
返回控制台.log(“无距离”);
}
如果(distance.status==“OK”){
对于(变量i=0;i}
发生这种情况是因为
距离矩阵(起点、终点、回调)
是异步的。在上面的代码距离中,矩阵方法被推送到事件循环并继续执行,在该方法回调执行之前,返回
resolve(message)

var async=require('async');
 var async = require('async');
 var calculateDistance = function (message, cLongitude, cLatitude, cSessionID) {
    return new Promise(function (resolve, reject) {

        distance.key = options.apiKey;
        distance.units('metric');

        var origins = [];
        origins.push(cLatitude + ',' + cLongitude);

        async.each(message, function(obj, callback) {
          obj.sessionId = cSessionID;
          var destinations = [];
          destinations.push(obj.geoLocation.latitude + ',' + obj.geoLocation.longitude);

          distance.matrix(origins, destinations, function (err, distances) {
            if (err) {
              callback(err);
            }
            if (!distances) {
              callback('no distances');
            }
            if (distances.status == 'OK') {
              for (var i = 0; i < origins.length; i++) {
                for (var j = 0; j < destinations.length; j++) {
                  var origin = distances.origin_addresses[i];
                  var destination = distances.destination_addresses[j];
                  if (distances.rows[0].elements[j].status == 'OK') {
                    var distance = distances.rows[i].elements[j].distance.text;
                    console.log('Distance from ' + origin + ' to ' + destination + ' is ' + distance);
                    obj.distance = distance;
                  } else {
                    console.log(destination + ' is not reachable by land from ' + origin);
                    obj.distance = 'N/A';
                  }
                }
              }
              callback(null);
            }
            });
          },function(err){
             if(err){
               return reject(err);
          }else{
              return resolve(message);
                }
         });
    });
};
var calculateInstance=函数(消息、克隆、类别、会话ID){ 返回新承诺(功能(解决、拒绝){ distance.key=options.apiKey; 距离。单位(“公制”); var来源=[]; 推(cLatitude+','+cLongitude); async.each(消息、函数(obj、回调){ obj.sessionId=cssessionid; var目的地=[]; destinations.push(obj.geoLocation.latitude+','+obj.geoLocation.longitude); 距离矩阵(起点、目的地、功能(错误、距离){ 如果(错误){ 回调(err); } 如果(!距离){ 回调(“无距离”); } 如果(distance.status==“OK”){ 对于(变量i=0;i
你需要仔细阅读承诺。在我看来,你似乎认为承诺是建立回调的神奇方式。“魔法”往往意味着“我不需要理解的东西”。在这种情况下,这不是真的

您的执行器函数(即以“function(resolve,reject)”开头的函数)应该设置一个异步请求。正常情况下,如果请求有回调,则在回调中放入“resolve”和“reject”。结果将是一个promise对象,它的方法“then”和“catch”用于请求后处理


由于您希望用大量异步请求的结果填充矩阵,因此需要阅读“Promise.all”,以便在所有请求都已解决时做出反应。

您是否每次都返回resolve疯狂..这是错误的抱歉,我没有看到foreach。现在应该没事了。嗨,谢谢你指出我错在哪里了。只是个问题。在哪里定义mainCallback函数?请参阅最新编辑。我忘了你在用承诺。所以我把它改为“解决”或“拒绝”。实际上。。它似乎从未进入距离矩阵块。如果我在里面放一个console.log(),它就不会打印任何东西。我是一名传统的C和Java程序员,所以我花了一段时间才习惯这种异步编程的思维方式。但现在我开始明白了。谢谢你告诉我正确的方向。如果你正在寻找更多的阅读,你可以考虑我写的一本简短的电子书: