синхронная функция не работает соответственно - PullRequest
1 голос
/ 23 марта 2020

Итак, я использовал passport-jwt и приступил к решению этой проблемы. У меня есть две модели: Сотрудник с именем, адресом, ролью, ... и Учетные данные Сотрудника с именем пользователя, passsword, employee (Object_Id). Тогда я хотел, чтобы после того, как я нашел имя пользователя и пароль сотрудника, мне нужна роль сотрудника, поэтому я использовал employee.findbyId, но он возвращает обещание и вызывает обратный вызов, прежде чем получить роль сотрудника.

что я хочу, почему это происходит (подробно об этом для понимания) ??? я не использовал async / await, поэтому функция синхронная.

 (passport)=>{
       let options = {};
       options.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
       options.secretOrKey = config.SECRET;
       passport.use(new Strategy( options,(payload,done)=>{
           Employee_credential.findById(payload.data._id, (err, employee)=>{
                  if(err)  return done(err,false);
                  if(employee){ 
                var result = Employee.getById(employee.employee).populate('role').catch(err=>{throw err})
                          employee.role = result.role.role_Id;
                          return done(null, employee);
                              }
                  return done(null,false);
              })
       })) 
}

1 Ответ

0 голосов
/ 23 марта 2020

Здесь может происходить последовательно , но не синхронно . Ваши функции выполняются в том порядке, в котором они написаны, но не ожидают результата вашего вызова API. Вот почему вы получаете обещание вместо роли работника. Чтобы сделать это, вы должны либо использовать async / await (мой предпочтительный метод), либо вернуть обещание и настроить следующую функцию с помощью .then.

Примечание из личного опыта, не все API будут работать правильно с await в зависимости от того, как они справляются с обещаниями. В некоторых случаях мне приходилось сочетать это с явным разрешением обещания через return new Promise((resolve) => { //your function; resolve(employee); } или что-то в этом роде.

...