Sunday, 18 September 2016

javascript - 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;
});

Answer



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
});

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...