Приостановить функцию, пока не будет вызвана другая - PullRequest
0 голосов
/ 13 октября 2018

У меня есть функция в узле, которая отвечает за регистрацию нового пользователя и сохранение объекта пользователя в базе данных.Однако это должно происходить только тогда, когда пользователь запрашивает код подтверждения SMS и затем вводит правильный отправленный код.Это модель моего текущего потока:

signUp(userData){
  sendVerificationCode()

  // after verifyCode() is called in the future and code is valid
  saveUserData()
}

sendVerificationCode(){
 // send a request to twilio which then sends an SMS to the user
}

verifyCode(){ 
 // send a request to twilio with the code and the response 
 // is whether the code is valid
}

signUp - это первая вызванная функция, затем она должна вызвать функцию sendVerificationCode, а затем в будущем будет вызвана verifyCode итолько тогда signUp следует продолжить и сохранить пользовательские данные.Как я могу это сделать?Кажется, мне нужно приостановить функцию, пока не будет вызвана другая функция.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я думаю, что вы могли бы использовать другое приближение для этого варианта использования.На предыдущем этапе клиент запрашивает код SMS, в этот момент вызов API завершается.

Во второй момент клиент отправляет информацию о коде и информацию о пользователе, вы проверяете код,и, если это правильно, вы сохраняете информацию о пользователе в базе данных.

Предполагая, что вы используете NodeJS 8, вы можете объявить verifyCode () как асинхронную функцию и использовать await verifyCode() для ожидания ответа.

Например:

// The first request of the client 
verificationCodeRequest(userData){
   sendVerificationCode()
}

signUp(userData){
   try {
     response = await verifyCode();  
     // Maybe, you need another validation
     if (isCodeCorrect) { 
        writeToDB(userData);
     } else {
       error();
     }
   } catch (err) {
     error();
   }


sendVerificationCode(){
 // send a request to twilio which then sends an SMS to the user
}

async verifyCode(){ 
 // send a request to twilio with the code and the response 
 // is whether the code is valid
}

Я надеюсь, что понял ваш вопрос и извините за мой английский, я работаю над ним.

0 голосов
/ 13 октября 2018

Я думаю, что есть более простые способы сделать это, чем приостановить выполнение функции.Я понимаю, что вы хотели бы сделать, и есть способы написать это асинхронно, позволяющие вам делать то, что вы хотите.

Вот очень простой пример того, что вы описываете в одном процессе.Предполагается, что signUp будет вызвано, когда пользователь попытается зарегистрироваться.Затем вызывается sendVerificationCode, что, как я полагаю, заставляет Twilio отправить пользователю код.userData хранится в памяти (для этого также можно использовать базу данных) в database.pendingUsers.Мы можем указать ожидающих пользователей по номеру телефона, который они дали для регистрации.На этом функция signUp заканчивается.

Я предполагаю, что следующим шагом для пользователя будет как-то ввести код в качестве ввода в нашу программу.Когда пользователь отправляет код обратно в наш скрипт (эта часть зависит от вас - никаких подробностей о http, командной строке и т. Д. Не было предоставлено), мы можем вызвать verifyCode.Когда вызывается verifyCode, нам нужен номер телефона (я не могу предложить, как его получить, не зная, как пользователь взаимодействует с этим кодом).Мы можем проверить код, который мы дали с Twilio, и, если он действителен, взять данные пользователя из pendingUsers и сохранить его до users.Вы можете использовать базу данных для этого, и в этом случае ваш код будет выглядеть по-другому, но логика будет похожа.

Вот пример кода:

const database = {
  pendingUsers: {},
  users: {},
};

signUp(userData){
  database.pendingUsers[userData.phone] = userData;
  sendVerificationCode(userData.phone);
}

sendVerificationCode(phone) {
  // send a request to twilio which then sends an SMS to the user
}

verifyCode(message) {
  // you need to get a hold of the phone number this verification code is for
  const phone = message.from;

  // send a request to twilio with the code and the response 
  // is whether the code is valid

  const verified = ...; // verify code

  if (!verified) {
    return false;
  }

  const userData = database.pendingUsers[phone];

  if (userData) {
    // remove from pending
    delete database.pendingUsers[phone];
    // save user
    database.users.push(userData);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...