Javascript 承诺语法
我已经浏览了几个promise语法,但我真的不理解它(包括那些有示例的语法)。他们中的大多数人解决了一个变量,但我的有点复杂,我似乎无法让它正常运行 我正在使用Firebase获取当前用户,并希望它在获取用户后运行下一行 这是我的密码:Javascript 承诺语法,javascript,reactjs,firebase,firebase-realtime-database,firebase-authentication,Javascript,Reactjs,Firebase,Firebase Realtime Database,Firebase Authentication,我已经浏览了几个promise语法,但我真的不理解它(包括那些有示例的语法)。他们中的大多数人解决了一个变量,但我的有点复杂,我似乎无法让它正常运行 我正在使用Firebase获取当前用户,并希望它在获取用户后运行下一行 这是我的密码: componentDidMount() { var promise = new Promise ((resolve, reject) => { var user = fire.auth().currentUser};
componentDidMount() {
var promise = new Promise ((resolve, reject) => {
var user = fire.auth().currentUser};
resolve(
if(user) {
console.log('Favorites: requesting favorites');
fire.database().ref('/favourites/' + user.uid).once('value').then(function (snapshot) {
var recipes_obj = snapshot.val();
let recipes = [];
for (let id in recipes_obj) {
let recipe = recipes_obj[id];
recipe.id = id;
recipes.push(recipe);
console.log("recipes: ", recipes)
}
console.log("recipes outside", recipes);
this.setState({ recipes: recipes });
}.bind(this));
} else {
console.log('Favorites: no user')
}
)
}
我也试过这样做
componentDidMount() {
var user = new Promise ((resolve, reject) => {
resolve(fire.auth().currentUser).then(() => {
if(user) {
console.log('Favorites: requesting favorites');
fire.database().ref('/favourites/' + user.uid).once('value').then(function (snapshot) {
var recipes_obj = snapshot.val();
let recipes = [];
for (let id in recipes_obj) {
let recipe = recipes_obj[id];
recipe.id = id;
recipes.push(recipe);
console.log("recipes: ", recipes)
}
console.log("recipes outside", recipes);
this.setState({ recipes: recipes });
}.bind(this));
} else {
console.log('Favorites: no user')
}
})
})
看起来你并没有在任何地方调用你的承诺,只是在你的组件中声明它?试试这样的。。顺便说一句,从未使用过firebase,因此不确定以下api的使用
componentDidMount() {
var promise = new Promise ((resolve, reject) => {
let user = ()=> fire.auth().currentUser
resolve(user)
})
promise().then((user)=>{
if(user) {
return fire.database().ref(`/favourites/${user.uid}`).once('value')
}
})
.then((snapshot)=>{
//Do other stuff with snapshot
})
}
这段代码不是异步的。当执行此行时,用户立即进入var user
。你不需要使用承诺来做一些事情来回应获得用户——你已经拥有了承诺
您需要创建一个新的Promise对象并解决它的唯一时间是当您有一些异步运行的工作,并且您没有其他承诺来指示该工作何时完成时
在代码中,您也不会将新承诺返回给调用方。这意味着承诺是无用的。除非你将一个承诺交给另一个根据其解决方案进行操作的代码位,否则这对情况并没有真正的帮助。换句话说,你的承诺在这里什么都没有做
代码中唯一的异步代码是从数据库中获取:
fire.database().ref('/favourites/' + user.uid).once('value')
once()
返回承诺。在您的代码中,您正在调用then()方法,以保证在结果可用后执行更多工作。someFunctionName(if(user){
-这看起来像javascript语法吗?因此它也不能与resolve
一起使用-事实上,这两个块都不是有效的语法,所以在修复语法之前,修复逻辑将很困难-我用另一个Firebase命令解决了这个问题,但当我使用这个命令时,rea我之所以尝试使用Promissions,是因为当我使用console.logs运行程序时,它显示用户未定义。直到程序第二次运行时,才定义了用户。因此我假设程序通过了,试图获得用户,但在获得用户时,它通过了if语句failed,因为还没有用户,直接转到else语句(我从else获取console.log)。如果没有用户登录,则不会有用户。如果在没有经过身份验证的情况下,您的代码可以运行,则在使用currentUser之前应始终检查此情况。您还可以使用身份验证侦听器准确查明有人登录或注销的时间。
fire.database().ref('/favourites/' + user.uid).once('value')