如何Promisify这个function – nodejs

我有一个Ajax调用需要返回一个承诺。 function如下

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

在执行下一个动作之前,我必须等待这个函数的执行。 我怎么能promisify这个function?

我尝试了以下,它给了我一个错误,说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; }); 

你有错误,因为create()不是一个Promise。 Promise的asynchronousfunction是很容易的(nodejs有一个内置的Promise支持时下):

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

而不是手动将asynchronous代码包装到承诺,我会build议使用像Bluebird这样的库来为你做这件事:

 var Bluebird = require('bluebird'); //either client.tickets = Bluebird.promisifyAll(client.tickets); //or client.tickets.createAsync = Bluebird.promisify(client.tickets.create); ... return client.tickets.createAsync(ticket) .then(JSON.stringify) .catch(err => { logger.error(error); return false }); 
 function createTicket(){ var deferred = Q.defer() client.tickets.create(ticket, function(err, req, result) { if (err) { logger.error(err); return deferred.reject(err) } return deferred.resolve(result) }); } createTicket().then(function(){ //success here }, function(){ //failure here }); 

使用Q api你可以达到承诺。