Javascript 如何在承诺中返回布尔值?
在submitButton事件中,我想检查是否有注册的用户 假设注册了5个用户:Javascript 如何在承诺中返回布尔值?,javascript,reactjs,promise,Javascript,Reactjs,Promise,在submitButton事件中,我想检查是否有注册的用户 假设注册了5个用户: getUsers = function () { return new Promise(function (resolve, reject) { resolve(5); reject(0); }); } 在checkregisteredUsers中,我调用getUsers,然后检查是否有任何用户。如果有任何用户,则返回true,否则返回false。我设置了UsersF
getUsers = function () {
return new Promise(function (resolve, reject) {
resolve(5);
reject(0);
});
}
在checkregisteredUsers中,我调用getUsers,然后检查是否有任何用户。如果有任何用户,则返回true,否则返回false。我设置了UsersFound的状态
checkRegisteredUsers = () => {
return this.getUsers().then(result => {
return this.setState({ UsersFound: result > 0 ? true : false };
}).catch(reason => {
console.log(reason);
});
}
现在,在函数submitButton中,我想检查是否有注册用户
submitButton = () => {
this.checkRegisteredUsers().then(result => {
this.setState({ UsersFound: result > 0 ? true : false });
});
if(!this.state.UsersFound){
return; **//exit code here and the rest of the code below should not execute and show the dialog box**
}
// run some other code
}
调用submitButton时,UsersFound的状态尚未设置。如果我第二次单击,则它已设置。
我怎样才能把它放在承诺里?或者,如何使用承诺检查submitButton中的true/false
编辑:
问题是:如何从承诺返回布尔值,因为我想检查如下内容:
submitButton = () => {
if(this.checkRegisteredUsers()){
return; //the rest of the code below should not execute
}
//if check users is true then the code below should not execute
// some other code
}
我不想要返回承诺,我想要一个布尔值。长话短说:不能让返回承诺的函数返回布尔值。如果您有一些异步操作(比如从某个服务获取用户的fetch),那么这本质上就是异步的。您不能让这样的函数返回布尔值,因为在函数本身结束时,您没有返回true或false的信息 最接近的方法是使用async/await。但是异步函数仍然只返回
Promise
对象。您可以使用async/await使它看起来不同,但它只是语法上的糖分。在wait
之后,您仍然有效地运行所有代码,就好像它是传递给then
的函数一样
例如,这:
//Some function that will resolve or reject.
const getUsers = () {
return new Promise(function (resolve, reject) {
resolve(5);
});
}
const foundUsers = async () => {
const users = await getUsers();
return Boolean(users);
}
const LoggedIn = () => {
const [usersFound, setUsersFound] = useState(false)
const onSubmit = async () => {
const found = await foundUsers();
if (found) {
//do stuff
}
setUsersFound(found)
}
return (
<>
<button onClick={onSubmit}>Submit</button>
{ usersFound ? <Dialog /> : <WhateverElse /> }
</>
)
}
//将解析或拒绝的某个函数。
常量getUsers=(){
返回新承诺(功能(解决、拒绝){
决心(5);
});
}
const foundUsers=async()=>{
const users=wait getUsers();
返回布尔值(用户);
}
常数LoggedIn=()=>{
常量[usersFound,setUsersFound]=useState(false)
const onSubmit=async()=>{
const found=wait foundUsers();
如果(找到){
//做事
}
setUsersFound(已找到)
}
返回(
提交
{usersFound?:}
)
}
与此相同:
const LoggedIn = () => {
const [usersFound, setUsersFound] = useState(false)
const onSubmit = () => {
foundUsers().then((found) => {
if (found) {
//do stuff
}
setUsersFound(found)
})
}
return (
<>
<button onClick={onSubmit}>Submit</button>
{ usersFound ? <Dialog /> : <WhateverElse /> }
</>
)
}
constloggedin=()=>{
常量[usersFound,setUsersFound]=useState(false)
const onSubmit=()=>{
foundUsers()。然后((找到)=>{
如果(找到){
//做事
}
setUsersFound(已找到)
})
}
返回(
提交
{usersFound?:}
)
}
将逻辑放入其中,然后从checkRegisteredUsers
方法中删除然后
和catch
回调。我建议使用asyn/await
语句来处理异步函数。您是这样建议的:checkRegisteredUsers=()=>{return this.getUsers();}
我仍然无法设置用户检查的状态。当我第一次点击按钮时,它仍然返回false。这个回答你的问题吗?其目的是,如果找到用户,则不执行代码insde submit按钮的其余部分。我该怎么做?这就是为什么我在这里尝试使用真-假。我将答案替换为我认为更好的答案,以回答您的问题“我如何从承诺中返回布尔值”。希望这更有意义。