Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js promise request return

I'm using the promis module to return my json data from the request module, but every time i run it, it gives me this.

Promise { _45: 0, _81: 0, _65: null, _54: null }

I can't get it to work, any one know the problem? here is my code:

function parse(){
return new Promise(function(json){
    request('https://bitskins.com/api/v1/get_account_balance/?api_key='+api+'&code='+code, function (error, response, body) {
        json(JSON.parse(body).data.available_balance);
    });
});
}

console.log(parse());
like image 449
Sam H Avatar asked Jan 01 '17 00:01

Sam H


People also ask

How do I return a promise?

Promise resolve() method: If the value is a promise then promise is returned. If the value has a “then” attached to the promise, then the returned promise will follow that “then” to till the final state. The promise fulfilled with its value will be returned.

Does node fetch return a promise?

fetch() The global fetch() method starts the process of fetching a resource from the network, returning a promise which is fulfilled once the response is available. The promise resolves to the Response object representing the response to your request.


2 Answers

A promise is an object that serves as a placeholder for a future value. Your parse() function returns that promise object. You get the future value in that promise by attaching a .then() handler to the promise like this:

function parse(){
    return new Promise(function(resolve, reject){
        request('https://bitskins.com/api/v1/get_account_balance/?api_key='+api+'&code='+code, function (error, response, body) {
            // in addition to parsing the value, deal with possible errors
            if (err) return reject(err);
            try {
                // JSON.parse() can throw an exception if not valid JSON
                resolve(JSON.parse(body).data.available_balance);
            } catch(e) {
                reject(e);
            }
        });
    });
}

parse().then(function(val) {
    console.log(val);
}).catch(function(err) {
    console.err(err);
});

This is asynchronous code so the ONLY way you get the value out of the promise is via the .then() handler.

List of modifications:

  1. Add .then() handler on returned promise object to get final result.
  2. Add .catch() handler on returned promise object to handle errors.
  3. Add error checking on err value in request() callback.
  4. Add try/catch around JSON.parse() since it can throw if invalid JSON
like image 145
jfriend00 Avatar answered Oct 23 '22 23:10

jfriend00


Use request-promise:

var rp = require('request-promise');

rp('http://www.google.com')
    .then(function (response) {
        // resolved
    })
    .catch(function (err) {
        // rejected
    });
like image 24
Oded Breiner Avatar answered Oct 24 '22 01:10

Oded Breiner