Search code examples
javascriptnode.jspromisezendesk

How to Promisify this function - nodejs


I have an ajax call which needs to return a promise. The function is as follows

client.tickets.create(ticket,  function(err, req, result) {
  if (err) {    
    logger.error(err);

    return false;
  }

  return JSON.stringify(result);
});

I have to wait for this function to execute before I can perform the next action. How can I promisify this function ?

I tried the following and it gave me an error saying Cannot call method then of undefined:

return client.tickets.create(ticket).then(function(result){
    return JSON.stringify(result);
},function(err){
    logger.error(err);
    return false;
});

Solution

  • You have the error because create() is not a Promise. Promisifying an async function is quite easy (nodejs has a built-in Promise support nowadays):

    function createTicket(ticket) {
        // 1 - Create a new Promise
        return new Promise(function (resolve, reject) {
            // 2 - Copy-paste your code inside this function
            client.tickets.create(ticket, function (err, req, result) {
                // 3 - in your async function's callback
                // replace return by reject (for the errors) and resolve (for the results)
                if (err) {
                    reject(err);
                } else {
                    resolve(JSON.stringify(result));
                }
            });
        });
    }
    
    // 4 - consume your promise with then() (resolved promise) and catch (rejected promise)
    createTicket(ticket).then(function (result) {
        // deal with result here
    }).catch(function (err) {
        // deal with error here
    });