【问题标题】:Promises Syntax承诺语法
【发布时间】:2017-04-07 05:41:17
【问题描述】:

我已经浏览了几个 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')
            }
        })

    })

【问题讨论】:

  • someFunctionName(if(user) { - 这看起来像 javascript 语法吗?所以它也不能与resolve 一起工作——事实上,这些块都不是有效的语法,所以在你修复你的语法之前修复你的逻辑会很困难

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


【解决方案1】:
var user = fire.auth().currentUser

此代码不是异步的。当此行执行时,您会立即在var user 中拥有该用户。您无需使用 promise 来响应获取用户 - 您已经拥有它。

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

在您的代码中,您也不会将新的承诺返回给调用者。这意味着承诺是无用的。除非您将承诺交给另一段代码来响应其解决方案,否则它并不能真正帮助解决这种情况。换句话说,你的 promise 在这里没有做任何事情。

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

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

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

【讨论】:

  • 我设法用另一个 Firebase 命令解决了这个问题,但是当我使用这个时,我尝试使用 Promises 的原因是因为当我使用 console.logs 运行程序时,它表明用户未定义。直到程序第二次再次运行,用户才被定义。所以我假设程序通过了,试图获取用户,但是在获取用户的同时,它通过了 if 语句,由于还没有用户而失败,然后直接进入 else 语句(我正在获取控制台.log 来自 else)。
  • 如果用户没有登录,就没有用户。如果你的代码在没有人通过身份验证的情况下可以运行,你应该在使用 currentUser 之前检查这种情况。您还可以使用身份验证侦听器来准确了解某人何时登录或退出。
【解决方案2】:

看起来你实际上并没有在任何地方调用你的承诺,只是在你的 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
                })
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多