麻烦Node JS承诺

我无法find一个解决scheme,为什么这个函数返回之前,我的消息数组更新与必要的值。

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); message.forEach(function (obj) { obj.sessionId = cSessionID; var destinations = []; destinations.push(obj.geoLocation.latitude + ',' + obj.geoLocation.longitude); distance.matrix(origins, destinations, function (err, distances) { if (err) { return console.log(err); } if (!distances) { return console.log('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'; } } } } }); }); return resolve(message); }); } 

有人能指出我在这里做错了吗?

问候吉米

  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); } }); }); }; 

这是因为你的distance.matrix(origins, destinations, callback )是asynchronous的。 在上面的代码中,distance.matrix方法被推送到事件循环并继续它的执行,并且在方法callback被执行之前, resolve(message)被返回。

你需要阅读承诺。 它看起来好像你在把承诺看成是build立callback的神奇方式。 “魔术”往往意味着“我不需要了解的东西”。 在这种情况下,这是不正确的。

你的执行器函数(即以'function(resolve,reject)'开头的函数)应该设置一个asynchronous请求。 如果正常情况下请求有callback,则在callback中放入“解决scheme”和“拒绝”。 结果将是一个承诺对象,其中有方法“然后”和“捕捉”你的请求后处理去。

既然你想用一堆asynchronous请求的结果来填充一个matrix,你需要阅读“Promise.all”,这样当所有的问题都解决了之后,你才能做出反应。