Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将回调转换为承诺时的混乱_Javascript_Ecmascript 6_Promise_Es6 Promise - Fatal编程技术网

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);
})