如何承诺这个功能 - nodejs
How to Promisify this function - nodejs
我有一个 ajax 电话需要 return 一个承诺。函数如下
client.tickets.create(ticket, function(err, req, result) {
if (err) {
logger.error(err);
return false;
}
return JSON.stringify(result);
});
我必须等待此功能执行后才能执行下一步操作。我怎样才能承诺这个功能?
我尝试了以下方法,但它给了我一个错误 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;
});
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 你可以实现承诺。
你有错误,因为 create()
不是 Promise。 Promise 异步函数非常简单(现在 nodejs 有 built-in 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
});
与其手动将异步代码包装到 promise 中,我建议使用 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
});
我有一个 ajax 电话需要 return 一个承诺。函数如下
client.tickets.create(ticket, function(err, req, result) {
if (err) {
logger.error(err);
return false;
}
return JSON.stringify(result);
});
我必须等待此功能执行后才能执行下一步操作。我怎样才能承诺这个功能?
我尝试了以下方法,但它给了我一个错误 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;
});
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 你可以实现承诺。
你有错误,因为 create()
不是 Promise。 Promise 异步函数非常简单(现在 nodejs 有 built-in 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
});
与其手动将异步代码包装到 promise 中,我建议使用 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
});