как сделать функцию в Promise - PullRequest
0 голосов
/ 07 мая 2020

Привет, я пытаюсь добавить функцию addUserToDBs к обещанию, но мне интересно, почему мой код не работает? Может ли кто-нибудь посоветовать? спасибо

исходная функция:

const addUserToDBs = (username) => {

    username = username.trim().toLowerCase();
    const existingUser = userDatas.users.find(user =>user.name === username);
    if (existingUser) {
        return { error: 'Username is taken' };
    }
    let newuser = {
        name: username,
        id: uuid.v4(),
        rooms: [],
        joinDate: +new Date()
    };
    userDatas.users.push(newuser);
    save(userDatas, userDB_PATH);
    return userDatas.users;


 };

функция сохранения, использованная в приведенной выше функции, также является обещанием

const fs = require("fs");
exports.save =(data, PATH) =>{
return new Promise((resolve, reject) => {
  fs.writeFile(PATH, JSON.stringify(data), function(err) {
    if (err) {
      reject(err);
    } else {
      resolve();
    }
    });
   });
  }

следующий код не работает, я интересно, почему?

 const addUserToDBs = (username) => {
return new Promise((resolve, reject)=>{
    username = username.trim().toLowerCase();
    const existingUser = userDatas.users.find(user =>user.name === username);
    if (existingUser) {
        reject({ error: 'Username is taken' }) ;
    }else{  

    let newuser = {
        name: username,
        id: uuid.v4(),
        rooms: [],
        joinDate: +new Date()
    };
        resolve(newuser)
    }

    userDatas.users.push(newuser);
    save(userDatas, userDB_PATH);
    return userDatas.users;

   })

    };

1 Ответ

1 голос
/ 07 мая 2020

Вы вызываете resolve в середине своей функции, поэтому функция save (userDatas) никогда не достигается. Также fs.writeFile () - это асинхронная функция, которую вы не ждете завершения перед возвратом userDatas.users. Рассмотрите возможность преобразования в async / await ...


const addUserToDBs = async username => {
    username = username.trim().toLowerCase();
    const existingUser = userDatas.users.find(user => user.name === username);
    if (existingUser) {
        throw new Error({ error: 'Username is taken' }) ;
    } 
    const newUser = ({
        name: username,
        id: uuid.v4(),
        rooms: [],
        joinDate: new Date()
    })
    userDatas.users.push(newUser);
    await save(userDatas, userDB_PATH)
    return newUser
}


addUserToDBs(userName)
    .then(newUser => {
       //do whatever you want with the new user
    })

...