возврат не прекращает обещание / затем цепочка - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий код, который я использую для регистрации пользователей.

const pgp = require('pg-promise')();
const crypto = require('./crypto.js');

const db = pgp(connection);

const querySelect = (text, params) => {  
  const s = pgp.as.format(text, params);  
  return db.any(s)
  .then(data => {    
    return data;    
  })
  .catch(error => {
    return error;
  });
}

const queryInsert = (text, params) => {  
  const s = pgp.as.format(text, params);  
  return db.one(s)
  .then(data => {    
    return data;    
  })
  .catch(error => {
    return error;
  });
}

const signup = (user) => {
  return new Promise((resolved, rejeted)=>{    
    return querySelect('select username from user WHERE username = $1', [user.username])      
    .then(res => {
      if (res.length == 0) {              
        return true;
      }      
      return resolved(false);  //SHOULD STOP + RETURN HERE                                 
    })
    .then(hashPasswordRes=>{      
      return crypto.hashPassword(user.password);
    })
    .then(queryRes=>{      
      if (queryRes) {
        return queryInsert('insert into user (username,password) values ($1,$2) RETURNING id', 
        [user.username, user.password]);      
      } else {            
        return rejeted('error while signup');
      }
    })
    .then(res=>{
      resolved(true);          
    })
    .catch(error => {
        return rejeted('error while signup');
    });// catch
  }) //promise
};//signup

exports.signup = signup;

Это в основном весь файл.Довольно просто, наверное.

Проблема в том, что в момент, когда я комментирую SHOULD STOP + RETURN HERE, он возвращает false (это означает, что это уже существующее имя пользователя, такое как вставленное), но выполнение никогда не останавливается, поэтому пользовательв конечном итоге сохраняется в базе данных (даже если return resolved(false); выполняется).

Что я здесь не так делаю?Раньше это работало, когда в моем коде был только модуль pg .Когда я использовал pg-обещание , у него возникла эта проблема.

Честно говоря, я понятия не имею, почему «возврат» также не останавливает выполнение функции.Пожалуйста, совет

(узел 8.11.1, экспресс 4.16.3, pg 7.4.2, pg-обещание 8.4.4)

Спасибо

РЕДАКТИРОВАТЬ

для справки, здесь тот же файл без pg-обещания, который работает просто отлично.Имена переменных меняются, но вы можете видеть логику.Я пытался использовать ту же логику с pg-обещания

  const crypto = require('./crypto.js');
  const {Client} = require('pg');


const getuser = (mail, client) => {
  return new Promise((resolved, rejeted)=>{
    return client.query('select mail from user WHERE mail = $1',[mail])
    .then(res => {
      resolved(res.rows);
     })
     .catch(e => {
        rejeted(e);
        client.end();
     }); // catch
  })//promise
} //getUser


const signup = (user) => {
  return new Promise((resolved, rejeted)=>{
    client.connect().then(() => {
        getuser(user.email, client) 
        .then(getUserRes => {
          if (getUserRes.length==0) {
            return true;
          }
          client.end();
          return resolved(false);
        })
        .then(hashPasswordRes=>{
            return crypto.hashPassword(user.password);
        })
        .then(queryRes=>{
          if (queryRes) {
            const nowtime = new Date();
            return client.query('insert into user(mail, password) values ($1,$2)',
            [user.email, queryRes])
          } else {
            client.end();
            return rejeted('some error');
          }
        })
        .then(res=>{
          resolved(true);
          client.end();
        })
    }) // client.connect then
    .catch(error => {
      rejeted('some error');
      client.end();
    });// catch
  }) //promise
};//signup


exports.signup = signup;

1 Ответ

0 голосов
/ 04 июня 2018

Возвращение завершает текущую функцию, которая не является цепочкой обещаний.Итак, эта часть:

return resolved(false);  //SHOULD STOP + RETURN HERE 

Завершает текущую функцию:

res => {
      if (res.length == 0) {              
        return true;
      }      
      return resolved(false);  //SHOULD STOP + RETURN HERE                                 
    }

Обращает внимание, что стрелка объявляет функцию.

Если вы хотите остановить цепочкуВы можете сделать что-то вроде этого

Promise.resolve(res)
.then(res => {
    if (shouldKeepGoing(res)) {
        return allTheOtherPromises(res)
    }
    return true
})

const allTheOtherPromises = res => {
    // Here you do all the promises you were doing
}
...