2017-03-01 69 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

拒绝处理程序将在第一次失败时被调用。也就是说,无论哪个收到的承诺失败,都会首先被拒绝处理程序处理。 –