KeterDev
KeterDev

Reputation: 7

Promise returns wrong value

In my code I try to assign a value to json variable to return it after (because I can't return it from the anon. function).

As my function is async, because it sends requests (maybe someone knows how to make it sync? I didn't plan to make it asynchronous), I've added await before the request (https.get).

I've been trying to get value from the Promise, but it's always undefined, even though I've awaited the async function.

Here's a code:

async function get_users() {
    const https = require('https');
    var token = '...';
    var json = undefined;

    await https.get('...', (resp) => {
        let data = '';

        resp.on('data', (chunk) => {
            data += chunk;
        });

        resp.on('end', () => {
            json = JSON.parse(data)['response']['items'];
        });
    }).on("error", (err) => {
        console.log("Error: " + err.message);
    });

    return json;
}

get_users().then(function(result) {
    console.log(result);
});

Upvotes: 0

Views: 531

Answers (2)

user7637745
user7637745

Reputation: 985

Return a Promise and resolve it, when the end event is called, otherwise reject it in case of an error occurred:

async function get_users() {
  const https = require('https');
  const token = '...';

  return new Promise((resolve, reject) => {
    https.get('...', resp => {
      let data = '';

      resp.on('data', chunk => {
        data += chunk;
      });

      resp.on('end', () => {
        let json;

        try {
          json = JSON.parse(data)['response']['items'];          
        } catch (e) {
          reject(e);
        };
        resolve(json);
      });
    }).on("error", err => reject(err));
  });
}

get_users().then(result => console.log(result));

Upvotes: 1

vasanth kumar
vasanth kumar

Reputation: 272

Please refer my below code.I had issues with getting responses from Promises too.But i finally got it to work.Here's the code:

var output;
var rp = require('request-promise-native');
var myJSONObject = {
  "inputs": [{
    "name": "<name>",
    "value": < value >
  }]
};
var orchName = 'TEST05';
postData = JSON.stringify(myJSONObject);
return networkCall(postData, orchName).then((response) => {
  console.log('response is' + response)

}).catch((response) => {
  console.log(`ERROR: ` + response);
});

function networkCall(postData, orchName) {
  return new Promise((resolve, reject) => {
    var options = {
      method: 'post',
      uri: '<URL>',
      body: postData,
      auth: {
        'user': 'usr',
        'pass': 'pwd'
      },
      json: true
    };
    return rp(options)
      .then(body => {
        var response = body;
        resolve(response);
      })
      .catch(err => {
        console.log('FAILED' + err);
        reject(err);
      });
  });
}

This way your code can run in Synchronous Flow.If the return value is undefined,then,what might have probably happened is that the calling function would have finished executing even before the called function returns its response.But the above approach would work just fine.

Upvotes: 0

Related Questions