Я использую async waterfall для создания двух вызовов API. Второй вызов зависит от данных от первого, поэтому важно, чтобы первый завершил выполнение до начала второго. Однако в следующем фрагменте кода вторая функция всегда начинается до завершения первого, поэтому она никогда не получает данные. Как я могу это исправить? Благодаря!Вложенные асинхронные вызовы api в водопаде Async
router.get("/", function(req, res, next){
var campaign;
var restaurant;
async.waterfall([
function(callback){
var url = "http://localhost:3000/api/campaign";
console.log("calling campaign");
request(url, function(err, response, body) {
// JSON body
if(err) { console.log(err); return; }
campaign = JSON.parse(body);
}, callback(null, campaign));
},
function(obj, callback){
console.log(obj.restaurant);
var url = "http://localhost:3000/api/restaurantByID/"+obj.restaurant;
console.log("calling restaurant");
request(url, function(err, response, body) {
// JSON body
if(err) { console.log(err); callback(true); return; }
restaurant = JSON.parse(body);
}, callback(null, restaurant));
}
],
function (err, result) {
if(err) { console.log(err); res.send(500,"Server Error"); return; }
res.render("home.html", {"title":"Home", "campaign": campaign, "restaurant": result});
});
});
ОБНОВЛЕНИЕ 1 я ошибочно поместил обратный вызов в качестве третьего аргумента для запроса. Я исправил это, но код по-прежнему не ведет себя так, как ожидалось. Благодаря
router.get("/", function(req, res, next){
var campaign;
var restaurant;
async.waterfall([
function(callback){
var url = "http://localhost:3000/api/campaign";
console.log("calling campaign");
request(url, function(err, response, body) {
// JSON body
if(err) { console.log(err);callback(true); return; }
campaign = JSON.parse(body);
callback(null, campaign.restaurant);
});
},
function(restaurant, callback){
console.log(restaurant);
var url = "http://localhost:3000/api/restaurantByID/"+restaurant;
console.log("calling restaurant");
request(url, function(err, response, body) {
// JSON body
if(err) { console.log(err); callback(true); return; }
restaurant = JSON.parse(body);
callback(null, restaurant);
});
}
],
function (err, result) {
if(err) { console.log(err); res.send(500,"Server Error"); return; }
res.render("home.html", {"title":"Home", "campaign": campaign, "restaurant": result});
});
Я исправил это (см. ОБНОВЛЕНИЕ 1 выше), но код по-прежнему не работает должным образом. Спасибо –
Хм, вы видите какие-то ошибки? Вы уверены, что перезапустили сервер после внесения изменений? – Brennan
@JoeJeanJJ вы можете это исправить? –