2016-01-19 2 views
1

В настоящее время я изучаю учебное пособие по внедрению сброса пароля из приложения node.js, и потребовалось, чтобы я использовал библиотеку async для очистки кода от обратного вызова , Я относительно новичок в Javascript и исхожу из более строго типизированных языков, таких как Java и Objective-C. У меня возникают проблемы с свободой, присущей языку.Как работают обратные вызовы в Javascript с async waterfall

В любом случае, я понимаю, как каждая предыдущая функция по существу передает значения до следующей функции через обратные вызовы, но мне трудно понять точку параметра «err» в начале каждого вызова обратного вызова. Например, в первой функции выполняется обратный вызов (err, токен), но следующая функция имеет токен в качестве своего первого параметра, а не err. Я изо всех сил пытаюсь понять, как следующая функция получает этот параметр токена и использует его, когда параметр «err» является тем, который указан в обратном вызове. Возможно, я ошибаюсь в понимании концепции или чего-то не хватает, поэтому любая помощь приветствуется.

app.post('/forgot', function (req, res, next) { 
    async.waterfall([function (done) { 
     crypto.randomBytes(20, function (err, buf) { 
      var token = buf.toString('hex'); 
      done(err, token); 
     }); 
    }, 
     function (token, done) { 
      User.findOne({ email: req.body.email }, function (err, user) { 
       if (!user) { 
        return { error : 'No account with that email address exists'}; 
       } 

       user.resetPasswordToken = token; 
       user.resetPasswordExpires = Date.now() + 3600000; //1 hour 

       user.save(function (err) { 
        done(err, token, user); 
       }); 
      }); 
     }, 
     function (token, user, done) { 
      var smtpTransport = nodemailer.createTransport('SMTP', { 
       service: 'SendGrid', 
       auth : { 
        user: "swagboi", 
        pass: "woo" 
       } 
      }); 
      var mailOptions = { 
       to: user.email, 
       from: '[email protected]', 
       text: 'You are receiving this because you (or someone else) have requested hte reset of the password for your account. \n\n' + 
        'Pleaes click on the following link, or paste this into your browser to complete the process: \n\n' + 
        'http://' + req.headers.host + '/reset/' + token + '\n\n' + 
        'If you did not request this, please ignore this email and your password will remain unchanged. \n' 
      }; 
      smtpTransport.sendMail(mailOptions, function (err) { 
       done(err, 'done'); 
      }); 
     } 
    ], function (err) { 
     if (err) return next(err); 
    }) 
}); 

ответ

2

Если вы внимательно посмотрите, вы увидите, что async.waterfall принимает два аргумента: список задач и обратного вызова.

done не просто следующая задача в списке. Это определенная функция, с которой async.waterfall знает, как действовать. Подумайте об этом, как

function done(err, result) { 
    if (err) { 
    callback(err); 
    } else { 
    tasks[i++](result, done); 
    } 
} 

(если done принимал только два аргумента)

И.Э. только результат передается следующей задаче в списке. Если ошибка прошла, вместо этого вызывается обратный вызов.

Relevant source code (что, вероятно, не так просто понять).

+0

Это прояснило все, я определенно неправильно понял использование. Большое вам спасибо за вашу помощь! – Coach

Смежные вопросы