Стенографическое обещание цепочки - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь научить себя ноду и выражать и пытаюсь создать простой сценарий входа в систему.Я новичок в обещаниях Javascript.

Моя пользовательская модель имеет функции, такие как exists, verifiyPassword и isApproved.Каждая функция выглядит следующим образом:

//Simplified verifyPassword function
User.prototype.verifyPassword=function(suppliedPassword){
    return new Promise((resolve,reject)=>{
        if(suppliedPassword === this.password){
            return resolve(true);
        }
        return reject(new Error('Password incorrect'));
    })
}

Я хочу объединить серию этих методов вместе, вот так (примечание: я тестирую с использованием пароля WRONG )

1-я попытка:

 user.exists()
.then(user.verifyPassword(req.body.password)).
.then(user.isApproved())
.then(()=>{
     console.log("Login successful");
}).catch(err=>{
      console.log("ERROR", err);
      throw err
});

Результат: UnhandledPromiseRejectionWarning: Error: Password incorrect Login successful

Очевидно, неверный результат (ошибка не была обнаружена и все же был выполнен успешный вход в систему).Я полагаю, что это потому, что user.verifyPassword() не возвращает свое обещание.

2-я попытка:

 user.exists()
.then(user.verifyPassword.bind(req.body.password)).
.then(user.isApproved)
.then(()=>{
     console.log("Login successful");
})

Я думаю, это могло бы сработать, но оно не передало req.body.password verifyPassword(вместо этого он передал true, результат разрешения user.exists()).

3-я попытка:

 user.exists()
.then(()=>{return user.verifyPassword.bind(req.body.password)}).
.then(()=>{return user.isApproved})
.then(()=>{
     console.log("Login successful");
})

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

Ответы [ 2 ]

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

уверен, что вы можете сократить свой код, но прежде всего есть несколько неправильных представлений об обещаниях.В конце я даю вам решение и другую короткую версию.Но я бы порекомендовал вам по-настоящему попытаться понять обещания подробно, прежде чем просто использовать этот код.Это важная часть JavaScript.

https://www.datchley.name/es6-promises/

https://www.datchley.name/promise-patterns-anti-patterns/


1.Попробуйте

.then(user.verifyPassword(req.body.password))

, тогда должен принять функцию.Но вы передаете результат verifyPassword, который является объектом Promise.Ваше выражение становится then(null), так что предыдущий результат user.exists() проходит через.

Вместо этого вы можете сделать следующее:

user.exists()
.then(() => user.verifyPassword(req.body.password))

2.Попробуйте

Очевидно, что неверный результат (ошибка не была обнаружена и все еще сделал успешный вход в систему).Я полагаю, что это потому, что user.verifyPassword () не возвращает свое обещание.

Посмотрите на сигнатуру функции bind :

`function.bind (thisArg [, arg1 [, arg2 [, ...]]]) ``

Итак, вы передаете req.body.password как thisArg.Это игнорируется, потому что пользователь был инициирован с новым. Но теперь нет arg1 , поэтому поставкиПароль не определен.

Вместо этого вы должны сделать:

user.verifyPassword.bind(null, req.body.password)

3.Попробуйте

Вы не вызываете verifyPassword и одобрено здесь.Итак, попробуйте это так:

.then(()=>{return user.isApproved()})

или даже короче:

.then( () => user.isApproved() )

Решение

 user.exists()
  .then(() => user.verifyPassword(req.body.password))
  .then(user.isApproved)
  .then(()=>{
     console.log("Login successful");
  }).catch(err=>{
      console.log("ERROR", err);
      throw err
  });

Сокращенное решение

Если вы хотите использовать еще более короткий синтаксис, вы можете использовать async / await. Это видео на YouTube может помочь вам.

async () => {
  try {
    await user.exists();
    await user.verifyPassword(req.body.password);
    await user.isApproved();

    console.log("Login successful");
  } catch(err) {
    console.log("ERROR", err);
    throw err
  }
0 голосов
/ 17 октября 2018

Вы можете использовать async / await следующим образом:

const checkUser = async () => {        
    await user.exists();
    await user.verifyPassword();
    await user.isApproved();
    console.log("Login successful");        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...