承诺语法

时间:2017-04-07 05:41:18

标签: javascript reactjs firebase firebase-realtime-database firebase-authentication

我已经查看了几种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')
            }
        })

    })

2 个答案:

答案 0 :(得分:0)

好像你实际上没有在任何地方宣布你的承诺只是在componentDidMount中声明它?试试这样的东西。顺便说一下,从来没有使用过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
                })
        }

答案 1 :(得分:0)

var user = fire.auth().currentUser

此代码不是异步的。执行此行时,您可以立即将用户放在var user中。您不需要使用承诺来回应获取用户 - 您已经拥有它。

您需要创建一个新的Promise对象并解决它的唯一时间是您有一些异步运行的工作,并且您没有其他承诺来指示该工作何时完成。

在您的代码中,您也不会向调用者返回新的承诺。这意味着承诺毫无用处。除非你将一个承诺交给另一个响应其解析而运行的代码,否则它并没有真正帮助这种情况。换句话说,你的承诺在这里没有做任何事情。

代码中异步的唯一代码是从数据库中获取:

fire.database().ref('/favourites/' + user.uid).once('value')

once()返回一个承诺。在您的代码中,您将在该承诺上调用then()方法,以便在结果可用后执行更多工作。