将回调转换为承诺时的困惑

时间:2018-08-30 11:39:27

标签: 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>'
    }, function(err, mail) {
      console.log('email sent!');
      cb(err);
    });
  }

像这样进入Promise

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块中如果我处理错误,那我将如何称呼拒绝

2 个答案:

答案 0 :(得分:0)

您可以使用util.promisify自动将回调转换为promise:

const { promisify } = require('util');
const sendEmails = promisify(MyModel.app.models.Emails.send);
sendEmails({ /* hard coded values you used */).then(() => {
  // done
});

请参见How do I convert an existing callback API to promises?

答案 1 :(得分:0)

您使用的Promise代码可以创建一个函数,然后在函数调用后使用.then,然后可以继续执行您的诺言链。 将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);
            }
       });
     })
 }

现在您可以在Promise链中使用此功能,例如

function1()
.then(() => {
  statement1;
  return MyModel.sendEmail();
})
.then(()=> {
        otherstatements;
})
.catch((err) => {
     console.log(err);
})