这个问题在这里已有答案:
我正在转换以下功能
// send an email
MyModel.sendEmail = function(cb) {
MyModel.app.models.Email.send({
to: '[email protected]',
from: '[email protected]',
subject: 'my subject',
text: 'my text',
html: 'my <em>html</em>'
}, function(err, mail) {
console.log('email sent!');
cb(err);
});
}
像这样的承诺
return new Promise(function (resolve, reject) {
return app.models.AppEmail.send({
to: message.to,
from: message.from,
subject: 'My RM Text',
text: message.text,
},
(err, response) => {
if (err) {
console.log('errr');
return reject(err);
} else {
console.log('email sent');
return resolve(response);
}
});
});
但我想完全将函数转换为Promise链接,所以我很困惑如何转换这部分
(err, response) => {
if (err) {
console.log('errr');
return reject(err);
} else {
console.log('email sent');
return resolve(response);
}
});
进入.then()
街区。我有点困惑,因为.then()
我认为只需要1个参数然后在catch块中如果我处理错误那么我将如何称为拒绝
您可以使用util.promisify
自动将回调转换为承诺:
const { promisify } = require('util');
const sendEmails = promisify(MyModel.app.models.Emails.send);
sendEmails({ /* hard coded values you used */).then(() => {
// done
});
您使用的Promise代码可以在函数调用之后生成函数并使用。然后可以继续您的promise链。将MyModel.sendEmail函数更改为
MyModel.sendEmail = function() {
return new Promise(function(resolve,reject){
MyModel.app.models.Email.send({
to: '[email protected]',
from: '[email protected]',
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);
}
});
})
}
现在你可以在Promise链中使用这个函数,例如
function1()
.then(() => {
statement1;
return MyModel.sendEmail();
})
.then(()=> {
otherstatements;
})
.catch((err) => {
console.log(err);
})