2017-01-14 19 views
1

メッセージ配列が必要な値で更新される前に、この関数が返される理由の解決策が見つかりません。ノードJS約束の問題

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

誰かが私がここで間違ってやっているものを私に指摘でした。

よろしく ジミー

答えて

0

あなたdistance.matrix(origins, destinations, callback)が非同期であるため、これが起こっています。上記のコードでは、distance.matrixメソッドがイベントループにプッシュされて実行を継続し、そのメソッドコールバックが実行される前にresolve(message)が返されます。

1
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); 
       } 
     }); 
    }); 
}; 
+0

あなたは毎回狂ったことを解決しています。それは間違っています。 – Sumeet

+0

あなたはforeachを見たことがありません。今は大丈夫でしょう。 –

+0

こんにちは、私はどこが間違っているかを指摘してくれました。ちょうど質問。 mainCallback関数はどこで定義しますか? –

0

約束を読み上げる必要があります。あなたが約束をコールバックを設定する魔法のように考えているかのように見えます。 「マジック」は、「私が理解する必要のないもの」を意味する傾向があります。この場合、それは真実ではありません。

あなたのexecutor関数(つまり、 'function(resolve、reject)'で始まる関数)は、1つの非同期要求を設定する必要があります。通常のようにリクエストにコールバックがある場合は、コールバックに '解決'と '拒否'を入れます。結果は、あなたのポストリクエスト処理がどこに行くのか、 'then'と 'catch'メソッドを持つ約束オブジェクトになります。

多くの非同期リクエストの結果で行列を埋めたいので、すべてが解決されたときに反応できるように、 'Promise.all'を読む必要があります。

+0

私はPromises and Asyncを読んでいます。私は伝統的なCとJavaのプログラマですので、この非同期プログラミングの考え方に慣れるまでしばらくかかりました。しかし、今私はそれを理解し始める。正しい方向に私を指してくれてありがとう。 –

+0

もっと読むことを望むなら、私が書いた短い電子ブックを考えてみてください。https://www.amazon.com/Javascript-Promises-Clarified-Adrian-Zimmer-ebook/dp/B01MZ6WYHJ/ –