将回调转换为承诺的困惑[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我正在转换以下功能

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

javascript ecmascript-6 promise es6-promise
2个回答
0
投票

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

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?


0
投票

您使用的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);
})
© www.soinside.com 2019 - 2024. All rights reserved.