嗨,我试图使函数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;
})
};
你在你的函数中间调用了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
})