2017-03-01 73 views
0

基本上我想要做的是等待並獲得前兩個函數結果並將該值傳遞給第三個函數。因此,使用Node 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; 
} 

然而此代碼不會返回其在第二然後代碼 「dropLocation」 定義的值,它返回爲未定義。你看到這裏有什麼問題嗎?

在此先感謝。

+0

getAddressDetail是否返回承諾? –

+0

是的,看到編輯。 –

+1

您並未等待第二個'getAddressDetail'完成,這就是爲什麼'dropLocation'的問題開始未定義。 –

回答

2

在你的代碼中發生了一些可怕的事情。

  1. return [pickupLocation,drop.location] WIL結果在一個處理1個參數(數組),所以不是.then(function (pickupLocation, dropLocation) {})你應該使用.then(function (results) {})

  2. var drop = getAddressDetail(, 51.528308, -0.3817812);看起來是不是一個承諾,因爲你立即獲得位置從結果。 (return [pickupLocation,drop.location];)那麼爲什麼不在下一個處理程序中獲取這個值呢?

  3. 如果getAddressDetail()確實返回一個承諾,那麼只需編寫一個承諾數組並使用.spread()操作,因爲第二個承諾中不需要第一個承諾。

一個例子;

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

拒絕處理程序將在第一次失敗時被調用。也就是說,無論哪個收到的承諾失敗,都會首先被拒絕處理程序處理。 –