kinkajou
kinkajou

Reputation: 3728

Request within a request in nodejs

I am using request library in nodejs. I need to call new url within the request but I am not able to join the response as it is asynchronouse. How do I send variable a as in below request containing result of request within a request.

 request({
    url: url,
    json: true
}, function (error, response, body) {
    var a = [];
    a.push(response);
    for (i = 0; i < a.length; i++) {
        if (a.somecondition === "rightcondition") {
            request({
                url: url2,
                json: true
            }, function (error, response, body) {
                a.push(response);
            });
        }
    }
    res.send(a);
});

Upvotes: 0

Views: 1324

Answers (2)

Sridhar
Sridhar

Reputation: 11796

You can use async waterfall

'use strict';

let async = require('async');
let request = require('request');

async.waterfall([function(callback) {
    request({
        url: url,
        json: true
    }, function(error, response, body) {
        callback(error, [response]);
    });
}, function(previousResponse, callback) {
    request({
        url: url2,
        json: true
    }, function(error, response, body) {
        for(i=0;i<previousResponse.length;i++){
          if(previousResponse.somecondition === "rightcondition"){
            previousResponse.push(response);
         }
        }
        callback(error, previousResponse);
    });
}], function(err, results) {
    if (err) {
        return res.send('Request failed');
    }
    // the results array will be final previousResponse
    console.log(results);
    res.send(results);
});

Upvotes: 0

Mark
Mark

Reputation: 92460

Your code seems almost right for what you want. You are just sending the response in the wrong callback. Move it so it only sends after the second request has completed:

request({
    url: url,
    json: true
}, function (error, response, body) {
    var a = [];
    a.push(response);
    request({
        url: url2,
        json: true
    }, function (error, response, body) {
        for(i=0;i<a.length;i++){
            if(a.somecondition === "rightcondition"){
                a.push(response);
            }
        }
        res.send(a); // this will send after the last request
    });
});

Upvotes: 1

Related Questions