Search code examples
node.jspromiserequest-response

node js call a promise function inside a chain .then


Hello I am new working with asynchronous calls I hope you can help me.

I have a .then chain where I want to call in the middle of the chain a function that returns a promise but it happens to me that the chain does not wait for it to have the result of the promise function and continues without waiting

var User = require('../models/user_model');
var mapbox = require('./helper/request_api_mapbox');

findOne_mapbox: (req, res) => {
  User.findById(req.params.id)
        .then(user => {
            
            ...
            return user.address;
        })
         .then(function (adress_to_mapbox) 
            {
                // mapbox.connect_mapbox returns a promise
                mapbox.connect_mapbox(adress_to_mapbox)
                .then(mapbox_coordinates => {
                    //inside this console.log is not read it
                    console.log("2 then mapbox_coordinates ", mapbox_coordinates)
                    return Promise.resolve(body);
                })   
                           
            })
             .then(  mapbox_coordinates  => {

                // in this console.log mapbox_coordinates returns undefined
                console.log("last promise mapbox_coordinates", 
                mapbox_coordinates)

                // I want to return mapbox_coordinates
                return res.status(200).send({
                    "response": "I only receive this string " 
                });
            })

}

the promise function is:

'use strict'

const rp = require('request-promise');
const access_token_mapbox = 'bla bla bla private';

function connect_mapbox(adress_to_mapbox) {
    return new Promise((resolve, reject) => {  
        
        var options = {
            method: 'GET',
            uri: 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + adress_to_mapbox + '.json?access_token=' + access_token_mapbox,                 
            json: true // Automatically stringifies the body to JSON
        };
    
        rp(options)
        .then(body => {
            if (body.hasOwnProperty('errcode') && body.errcode != 0) {
            return Promise.reject(body);
            }
            console.log("inside connect_mapbox function on mapbox_model 2", body)
            
            return Promise.resolve(body);
        })
        .catch(err => {
            debug(err);
            return Promise.reject(err);
        })
        
    })  
}   

module.exports = { connect_mapbox };

Inside the promise function I can see in my console.log that it makes the api call properly and the response body is ok.


Solution

  • I am starting in the programming, I solved the problem in the following way although I don't know if it is the most correct

    I solved it by converting the connect_mapbox promise function to async await and the .then chain to async await like so:

    'use strict'
    
    const rp = require('request-promise');
    const access_token_mapbox = 'bla bla bla private';
    
    async function connect_mapbox(adress_to_mapbox) {
    
        try {
    
            var options = {
                method: 'GET',
                uri: 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + adress_to_mapbox + '.json?access_token=' + access_token_mapbox,                 
                json: true // Automatically stringifies the body to JSON
            };
    
            let response = await rp(options);
    
            console.log("inside connect_mapbox function on mapbox_model", response)
    
            if (response.hasOwnProperty('errcode') && body.errcode != 0) {
                return Promise.reject(response);
            }
    
            return Promise.resolve(response);
    
        }catch(error) {
            return Promise.reject(error);
        }
    }
    
    module.exports = { connect_mapbox };
    

    And the .then chain like

    var User = require('../models/user_model');
    var mapbox = require('./helper/request_api_mapbox');
    
    findOne_mapbox: (req, res) => {
      User.findById(req.params.id)
            .then(user => {
                
                ...
                return user.address;
            })
             .then(async function (adress_to_mapbox) 
                {
                    
                    console.log("adress_to_mapbox thit could be deleted", adress_to_mapbox)
                        
                    let mapbox_response = await mapbox.connect_mapbox(adress_to_mapbox)
                       
                    console.log("async mapbox_response", mapbox_response) 
    
                    return res.status(200).send({
                        mapbox_response 
                    });
                })
                 ...
    
    }