Node JS中承诺圈内的承诺圈
Promisified cicle inside promisified cicle in NodeJS
我在 NodeJS 中遇到 promises 问题,甚至认为我使用的是 Bluebird。在以下代码中:
var Promise = require('bluebird');
var google = require('utils/google');
// list of (max 60 * number of types defined) nearby places
var nearby_places = [];
Promise.each(config.type.nearby, function (type) {
google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
.then(function (places) {
// list of (max 60) places
var detailed_places = [];
console.log('Found ' + places.length + ' places.');
// Get full details of places and insert them into database
Promise.each(places, function (place_id) {
google.getPlaceDetails(place_id)
.then(function (res) {
detailed_places.push(res);
})
.catch(function (err) {
console.log(err);
});
})
.then(function () {
// Push detailed places to nearby places
nearby_places = nearby_places.concat(detailed_places);
});
})
.catch(function (err) {
console.log(err);
});
}).then(function () {
// Returns (max 60 * number of types defined) nearby places
return reply(nearby_places);
});
它执行 google.nearbySearch()
并在其中打印一些东西,所以我知道它是 运行。但是当它结束时,它不会等待内部 Promise.each(places, ...
。它直接进入 return reply(...
,nearby_places
为空。然后,它在控制台中显示 Found X places.
.
我不认为我完全理解Promises/Bluebird,但我不知道我做错了什么。
问题是您没有 return
来自 .then()
的 Promise
链接到 google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
。
您应该能够通过从链接到初始 google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
调用
的 .then()
返回 Promise.each(places, function(){})
来解决问题
return Promise.each(places, function(){})
我在 NodeJS 中遇到 promises 问题,甚至认为我使用的是 Bluebird。在以下代码中:
var Promise = require('bluebird');
var google = require('utils/google');
// list of (max 60 * number of types defined) nearby places
var nearby_places = [];
Promise.each(config.type.nearby, function (type) {
google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
.then(function (places) {
// list of (max 60) places
var detailed_places = [];
console.log('Found ' + places.length + ' places.');
// Get full details of places and insert them into database
Promise.each(places, function (place_id) {
google.getPlaceDetails(place_id)
.then(function (res) {
detailed_places.push(res);
})
.catch(function (err) {
console.log(err);
});
})
.then(function () {
// Push detailed places to nearby places
nearby_places = nearby_places.concat(detailed_places);
});
})
.catch(function (err) {
console.log(err);
});
}).then(function () {
// Returns (max 60 * number of types defined) nearby places
return reply(nearby_places);
});
它执行 google.nearbySearch()
并在其中打印一些东西,所以我知道它是 运行。但是当它结束时,它不会等待内部 Promise.each(places, ...
。它直接进入 return reply(...
,nearby_places
为空。然后,它在控制台中显示 Found X places.
.
我不认为我完全理解Promises/Bluebird,但我不知道我做错了什么。
问题是您没有 return
来自 .then()
的 Promise
链接到 google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
。
您应该能够通过从链接到初始 google.nearbySearch(request.query.lat, request.query.lng, request.query.rad, type)
调用
.then()
返回 Promise.each(places, function(){})
来解决问题
return Promise.each(places, function(){})