如何将函数转化为Promise

问题描述 投票:0回答:1

嗨,我试图使函数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;

   })

    };
function promise fs
1个回答
1
投票

你在你的函数中间调用了resolve,所以save(userDatas)函数永远不会到达。另外fs.writeFile()是一个异步函数,你没有等待完成后再返回userDatas.users。可以考虑转换为asyncawait...


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
    })

© www.soinside.com 2019 - 2024. All rights reserved.