【问题标题】:Calling a function from another file and get the result when it's done?从另一个文件调用函数并在完成后获取结果?
【发布时间】:2019-12-17 23:31:07
【问题描述】:

如果第一个函数完成并返回 true,那么从另一个文件调用函数然后执行其他操作的最佳方法是什么?

module.exports = {
  sendEmail: function(user, subject, text) {
    var smtpTransport = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: config.email,
        pass: config.gmlpwd
      }
    });
    var mailOptions = {
      to: user,
      from: config.email,
      subject: subject,
      text: text
    };
    smtpTransport.sendMail(mailOptions, function(err) {
      return true
    });
  }
}
mailer.sendEmail(user.email, subject, text, function(){
     //do something here if the function is done successfully, but it never gets called
});

【问题讨论】:

    标签: javascript function


    【解决方案1】:

    在您的 sendMail 函数中,您需要将该回调添加为参数,然后在完成后调用它。

    module.exports = {
      sendEmail: function(user, subject, text, cb) {
        var smtpTransport = nodemailer.createTransport({
          service: 'gmail',
          auth: {
            user: config.email,
            pass: config.gmlpwd
          }
        });
        var mailOptions = {
          to: user,
          from: config.email,
          subject: subject,
          text: text
        };
        smtpTransport.sendMail(mailOptions, function(err) {
          return cb(err);
        });
      }
    }
    
    mailer.sendEmail(user.email, subject, text, function(){
         // do something here
    });
    

    但是,重复执行此操作可能会导致您进入 callback hell,我建议您考虑改用 Promises 或 RxJS。

    【讨论】:

      【解决方案2】:
            <!-- With cb -->
      
            module.exports = {
               sendEmail: function(user, subject, text, callback) {
                  var smtpTransport = nodemailer.createTransport({
                    service: 'gmail',
                    auth: {
                      user: config.email,
                      pass: config.gmlpwd
                    }
                  });
                  var mailOptions = {
                    to: user,
                    from: config.email,
                    subject: subject,
                    text: text
                  };
                  smtpTransport.sendMail(mailOptions, function(err) {
                    if (err) callback({ err })
                    callback({ result: "All is ok" })
                  });
              }
            }
      
            // 
      
          var mailer = require('./file.js');
          mailer.sendMail('go@mail.com', 'Hello world', 'Lorem ipsum dolor sit ammet', function({ err, result}){
            if (err) {
              console.log(err, '- Some error')
      
            } else {
              console.log(result, 'Some code here')
            }
          })
        <!-- With Async promise -->
      
        module.exports = {
           sendEmail:  new Promise(function(resolve, reject){
              function(user, subject, text) {
                var smtpTransport = nodemailer.createTransport({
                  service: 'gmail',
                  auth: {
                    user: config.email,
                    pass: config.gmlpwd
                  }
                });
                var mailOptions = {
                  to: user,
                  from: config.email,
                  subject: subject,
                  text: text
                };
                smtpTransport.sendMail(mailOptions, function(err) {
                  if (err) reject({ err })
                  resolve({ result: 'All is ok result here'})
                });
            }
          }
        }
      
        // 
      
      var mailer = require('./file.js');
      mailer.sendMail('go@mail.com', 'Hello world', 'Lorem ipsum dolor sit ammet').then(function ({ result}) {
        console.log( 'All is ok')
      })
      

      【讨论】:

        【解决方案3】:

        在这种情况下我更喜欢使用async/await,在你的情况下,你只需要将你的函数与对象一起导出并导出,让我们看看下面的例子。

        文件 1:userController.js

        const userUtils = require('./userUtils');
        
        const userCtr = {};
        
        userCtr.searchUser = async (req, res) => {
          try {
            const { userName } = req.query;
            const result = await userUtils.searchUser(userName);
            return res.status(200).json(result);
          } catch (err) {
            return res.status(err.code).json({ error: err.error });
          }
        };
        
        module.exports = userCtr;
        

        文件2:userUtils.js

        const userUtils = {};
        
        userUtils.searchUser = async (userName) => {
          try {
            if (userName) {
              // ...Do some cool stuff
              const result = [];
              return result;
            }
            const errorObj = { code: 400, error: 'ERR_VALID_PARAM' };
            throw errorObj;
          } catch (err) {
            console.error(err);
            throw err;
          }
        };
        
        module.exports = userUtils;
        

        在上述实例中,我们从userUtils 调用函数searchUser(),如果存在参数,它将返回一个空数组,否则将引发错误。这只是一个简单的用例,供您理解module.exports

        【讨论】:

          猜你喜欢
          • 2018-01-09
          • 1970-01-01
          • 1970-01-01
          • 2018-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 1970-01-01
          相关资源
          最近更新 更多