2017-03-01 28 views
0

基本的には、最初の2つの関数の結果を待ってその値を3番目の関数に渡します。したがって、ノードQモジュールで私は以下のコードを試しました。ノードJSは複数の約束から値を取得する

getAddressDetail("", 51.528308, -0.3817812).then(function (pickupLoc) { 
    return pickupLoc.location; 
}).then(function (pickupLocation) { 
    var drop = getAddressDetail(, 51.528308, -0.3817812); 
    return [pickupLocation,drop.location]; 
}) 
.then(function (pickupLocation, dropLocation) { 
    console.log("#####" + pickupLocation +"$$$" + dropLocation) 
}) 
.done(); 

EDIT

function getAddressDetail(location = "", lat, long) { 

    var deferred = Q.defer(); 

    var getLocation = ""; 
    if (location == '' || location == 'undefined') { 

    var url = 'https://maps.googleapis.com/maps/api/geocode/json?key={APIKEY}&latlng=' + lat + ',' + long + '&sensor=false'; 

    request({ 
     url: url, 
     json: true 
    }, function(error, response, body) { 

     if (!error && response.statusCode === 200) { 

     getLocation = body.results[0].formatted_address; 
     deferred.resolve({ 
      'location': getLocation 
     }); 
     //console.log("*******" + getLocation); 
     } 

    }) 
    } else { 
    getLocation = location; 
    deferred.resolve({ 
     'location': getLocation 
    }); 
    } 
    return deferred.promise; 
} 

しかし、このコードは、それが未定義戻り、次いで第2のコード "dropLocation" で定義された値を返しません。ここに何か問題はありますか?

ありがとうございます。

+0

'getAddressDetail'は約束を返しますか? –

+0

ええ、編集を参照してください。 –

+1

2番目の 'getAddressDetail'が終了するのを待っているわけではありません。そのため、' dropLocation' begin 'undefined'の問題があります。 –

答えて

2

あなたのコードにはいくつかの厄介なことが起こっています。あなたがすぐに場所を取得するための約束ではありませんようにあなたが.then(function (results) {})

  • var drop = getAddressDetail(, 51.528308, -0.3817812);を使用する必要がありますので、代わりに.then(function (pickupLocation, dropLocation) {})の次のハンドラで1つのパラメータ(配列)、中

    1. return [pickupLocation,drop.location]ウィル結果が見えますその結果から。 (return [pickupLocation,drop.location];)だから、なぜこの値を次のハンドラでフェッチしないのですか?

    2. getAddressDetail()が約束を返す場合は、約束の配列を作成し、.spread()演算を使用して、2番目の約束の結果として最初の約束の結果が不要になります。

    例。

    var promiseArray = []; 
    
    promiseArray.push(getAddressDetail("", 51.528308, -0.3817812)); 
    promiseArray.push(getAddressDetail("", 51.528308, -0.3817812)); 
    
    Q.spread(promiseArray, function(pickupLocation, drop){ 
        // first parameter (pickupLocation) = result of first promise 
        // second parameter (drop) = result of second promise 
    }); 
    
  • +0

    返事ありがとう、これは私が期待しているものです。私は実際にノードに新しいビーです。最初の約束が失敗した場合、Q.spread()コードブロックが実行されるかどうかを知ることができますか? –

    +0

    拒否ハンドラは、失敗の最初の兆候で呼び出されます。すなわち、受信した約束事が最初に失敗したものが、拒絶ハンドラによって処理される。 –

    関連する問題