Javascript 承诺语法

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

我已经浏览了几个promise语法,但我真的不理解它(包括那些有示例的语法)。他们中的大多数人解决了一个变量,但我的有点复杂,我似乎无法让它正常运行

我正在使用Firebase获取当前用户,并希望它在获取用户后运行下一行

这是我的密码:

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