2015-05-04 5 views
0

Я использую 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}); 
    }); 

ответ

0

Я не уверен, что request занимает в 3 аргумента в функции. Попробуйте вызвать его внутри обратного вызова, а не как аргумент, как показано ниже:

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, restaurant) 
    }); 
    }, 
    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) 
    }); 
    } 
] 
+0

Я исправил это (см. ОБНОВЛЕНИЕ 1 выше), но код по-прежнему не работает должным образом. Спасибо –

+0

Хм, вы видите какие-то ошибки? Вы уверены, что перезапустили сервер после внесения изменений? – Brennan

+0

@JoeJeanJJ вы можете это исправить? –

Смежные вопросы