如何在Node.js中的异步瀑布中调用另一个函数?

时间:2016-12-20 11:03:22

标签: node.js async.js

我刚刚使用了异步瀑布方法,但我对于接着调用该函数感到困惑。我想控制'hi',但它没有被调用。有人可以建议帮忙吗?

 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) {

      });
    };

3 个答案:

答案 0 :(得分:0)

我认为在这种情况下你没有正确处理回调或完成函数。试试这个

<input class="form-control" placeholder="yyyy-mm-dd" ngbDatepicker
    name="dp-start" [(ngModel)]="startDate"
    #dpStart="ngbDatepicker" id="dp-start">

答案 1 :(得分:0)

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

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函数。此参数值不为null,这意味着回调错误参数不为null。这会导致瀑布流产并立即调用瀑布函数的错误部分。

答案 2 :(得分:0)

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