【问题标题】:How to call another function in async waterfall in Node.js?如何在 Node.js 的异步瀑布中调用另一个函数?
【发布时间】:2018-02-11 00:55:55
【问题描述】:

我刚刚使用了异步瀑布方法,但我对一个接一个地调用该函数感到困惑。我想安慰“嗨”,但它没有被调用。任何人都可以提供帮助吗?

 exports.inviteAgent = function (req, res) {
      var obj = {};
      async.waterfall([
        function (done) {
          var url = config.mailer.inviteAgentUrl;
          res.render('modules/users/server/templates/invite-agent', {
            name: obj.name,
          }, function (err, emailHTML) {
            done(err, emailHTML);
          });
        },
        // If valid email, send reset email using service
        function (emailHTML, done) {
          var mailOptions = {
            to: obj.email,
            from: config.mailer.from,
            subject: 'Invite agent',
            html: emailHTML
          };
          smtpTransport.sendMail(mailOptions, function (err) {
            if (err) {
              return res.send({ 'respCode': common.statusCodes.COMMON, 'respMessage': errorHandler.getErrorMessage(err) });
            } else {
              res.jsonp({ 'respCode': common.statusCodes.SUCCESS, 'respMessage': 'Send email successfully' });
              done(done);
            }
          });
        },
        function (done) {
    console.log('hi')
        }
      ], function (err) {

      });
    };

【问题讨论】:

    标签: node.js async.js


    【解决方案1】:

    我认为您在这种情况下没有正确处理回调或完成功能。试试这个

    exports.inviteAgent = function (req, res) {
    var obj = {};
    async.waterfall([
        function (done) {
            var url = config.mailer.inviteAgentUrl;
            res.render('modules/users/server/templates/invite-agent', {
                name: obj.name,
            }, function (err, emailHTML) {
                done(err, emailHTML);
            });
        },
        // If valid email, send reset email using service
        function (emailHTML, done) {
            var mailOptions = {
                to: obj.email,
                from: config.mailer.from,
                subject: 'Invite agent',
                html: emailHTML
            };
            smtpTransport.sendMail(mailOptions, function (err) {
                if (err) {
                    res.send({ 'respCode': common.statusCodes.COMMON, 'respMessage': errorHandler.getErrorMessage(err) });
                    done(err);
                } else {
                    res.jsonp({ 'respCode': common.statusCodes.SUCCESS, 'respMessage': 'Send email successfully' });
                    done();
                }
            });
        },
        function (done) {
            console.log('hi');
            done();
        }
    ], function (err) {
        if(err) console.log(err);
    });
    

    【讨论】:

      【解决方案2】:

      你需要更加小心你的变量名。我已经重构了您的代码以区分您对“完成”名称的使用。

      exports.inviteAgent = function (req, res) {
          var obj = {};
          async.waterfall([
              function (callback1) {
                  var url = config.mailer.inviteAgentUrl;
                  res.render('modules/users/server/templates/invite-agent', {name: obj.name,}, function (err, emailHTML) {
                      callback1(err, emailHTML);
                  });
              },
              // If valid email, send reset email using service
              function (emailHTML, callback2) {
                  var mailOptions = {};
                  smtpTransport.sendMail(mailOptions, function (err) {
                      if (err) {
                          return res.send({ 'respCode': common.statusCodes.COMMON, 'respMessage': errorHandler.getErrorMessage(err) });
                      } else {
                          res.jsonp({ 'respCode': common.statusCodes.SUCCESS, 'respMessage': 'Send email successfully' });
                          callback2(callback2); // <== ERROR HERE
                      }
                  });
              },
              function (callback3) {
                  console.log('hi')
              }
          ], function (err) {});
      };
      

      您自己调用 callback2 函数。该参数值不为空,即回调错误参数不为空。这会导致瀑布流中止并立即调用瀑布函数的错误部分。

      【讨论】:

        【解决方案3】:

        当你从瀑布的内部函数返回回调 done() 时,如果有错误你必须调用 done(err)。如果没有错误调用 done(null, data) 数据包含发送到下一个函数的争论。因为 done() 中的第一个参数是 err,如果它为 null,那么它会转到下一个函数,否则它会停止瀑布的执行。

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 1970-01-01
          • 2014-10-31
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 2017-04-26
          • 1970-01-01
          相关资源
          最近更新 更多