Javascript 将回调转换为承诺时的混乱
我正在转换下面的函数Javascript 将回调转换为承诺时的混乱,javascript,ecmascript-6,promise,es6-promise,Javascript,Ecmascript 6,Promise,Es6 Promise,我正在转换下面的函数 // send an email MyModel.sendEmail = function(cb) { MyModel.app.models.Email.send({ to: 'foo@bar.com', from: 'you@gmail.com', subject: 'my subject', text: 'my text', html: 'my <em>html</em>'
// send an email
MyModel.sendEmail = function(cb) {
MyModel.app.models.Email.send({
to: 'foo@bar.com',
from: 'you@gmail.com',
subject: 'my subject',
text: 'my text',
html: 'my <em>html</em>'
}, function(err, mail) {
console.log('email sent!');
cb(err);
});
}
但是我想将函数完全转换为承诺链,所以我很困惑如何转换这一部分
(err, response) => {
if (err) {
console.log('errr');
return reject(err);
} else {
console.log('email sent');
return resolve(response);
}
});
进入
。然后()
块。我有点困惑,因为.then()
我认为只需要一个参数,然后在catch块中如果我处理错误,我将如何调用reject您可以使用util.promisify自动将回调转换为承诺:
const { promisify } = require('util');
const sendEmails = promisify(MyModel.app.models.Emails.send);
sendEmails({ /* hard coded values you used */).then(() => {
// done
});
请参阅您使用的承诺代码,您可以创建一个函数并使用。然后在函数调用后,您可以继续承诺链。
将MyModel.sendEmail函数更改为
MyModel.sendEmail = function() {
return new Promise(function(resolve,reject){
MyModel.app.models.Email.send({
to: 'foo@bar.com',
from: 'you@gmail.com',
subject: 'my subject',
text: 'my text',
html: 'my <em>html</em>'
}, function(err, mail) {
if (err) {
console.log('errr');
reject(err);
} else {
console.log('email sent');
resolve(response);
}
});
})
}
什么不起作用?显示的方法似乎很好,一切正常,但我想删除中的回调函数。然后,阻止将send
API转换为返回承诺的函数的整个要点是,您的send
函数接受回调,但不允许使用then
。我知道这是将回调转换为承诺的新方法但是你能告诉我如何通过创建新的承诺来实现吗
MyModel.sendEmail = function() {
return new Promise(function(resolve,reject){
MyModel.app.models.Email.send({
to: 'foo@bar.com',
from: 'you@gmail.com',
subject: 'my subject',
text: 'my text',
html: 'my <em>html</em>'
}, function(err, mail) {
if (err) {
console.log('errr');
reject(err);
} else {
console.log('email sent');
resolve(response);
}
});
})
}
function1()
.then(() => {
statement1;
return MyModel.sendEmail();
})
.then(()=> {
otherstatements;
})
.catch((err) => {
console.log(err);
})