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程序员,所以我花了一段时间才习惯这种异步编程的思维方式。但现在我开始明白了。谢谢你告诉我正确的方向。如果你正在寻找更多的阅读,你可以考虑我写的一本简短的电子书: