Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 云函数如何嵌套承诺_Javascript_Firebase Realtime Database_Google Cloud Functions - Fatal编程技术网

Javascript 云函数如何嵌套承诺

Javascript 云函数如何嵌套承诺,javascript,firebase-realtime-database,google-cloud-functions,Javascript,Firebase Realtime Database,Google Cloud Functions,我需要做出一些承诺 我首先需要使用:.set(admin.database.ServerValue.increment(1)) 完成后,我需要在不同的ref更新一些数据:return admin.database().ref('/user\u credits/'+creditId+'/'+userId).set({“joined\u date”:receivedTimeStamp,“timeStamp”:receivedTimeStamp,“credits\u count”:1}) 下面的代码正

我需要做出一些承诺

我首先需要使用:
.set(admin.database.ServerValue.increment(1))

完成后,我需要在不同的ref更新一些数据:
return admin.database().ref('/user\u credits/'+creditId+'/'+userId).set({“joined\u date”:receivedTimeStamp,“timeStamp”:receivedTimeStamp,“credits\u count”:1})

下面的代码正常工作,两个引用都按预期更新,但我收到一个警告:

const functions=require('firebase-functions');
const admin=require('firebase-admin');
admin.initializeApp();
exports.updateViewsCtAtPostsRef=functions.https.onRequest((请求,响应)=>{
const currentTimeStamp=Date.now();
const receivedTimeStamp=admin.database.ServerValue.TIMESTAMP;
const creditId=“sample_123”;
const userId=“userId\u xyz”;
const gameId=“game\u abc”;
admin.database().ref('user_credits').child(creditId).child(userId).once('value',snapshot=>{
如果(!snapshot.exists()){
admin.database().ref('/games/'+gameId+'/'+'score').set(admin.database.ServerValue.increment(1))
.然后(()=>{
return admin.database().ref('/user\u credits/'+creditId+'/'+userId).set({“加入日期”:receivedTimeStamp,“timeStamp”:receivedTimeStamp,“credits\u count”:1})
.然后(()=>{
返回true;
})
.捕捉(错误);
})
.捕捉(错误);
}否则{
const-previousTimeStamp=snapshot.child(“timeStamp”).val();
const creditscont=snapshot.child(“credits_count”).val();
如果(以前的时间戳+任何内容){
返回admin.database().ref('/user\u credits/'+creditId+'/'+userId).update({“timeStamp”:receivedTimeStamp,“credits\u count”:updatedCount})
.然后(()=>{
返回true;
})
.捕捉(错误);
})
.捕捉(错误);
}否则{
返回真值
}
}
});
});

警告消息告诉您要避免嵌套承诺,因为JS中的反模式会导致错误。啊,好吧,我对Javascript不熟悉,我知道的很少。我认为这就像斯威夫特一样,我可以在那里嵌套回调。谢谢你提供的信息,我会查看链接。你可以嵌套回调,但这被认为是个坏主意。重写以避免嵌套,或者禁用eslint警告消息并确保正确执行。将两个更新一起执行是好主意还是坏主意?例如,首先是Server.increment(1),然后是它下面的行addreturn。。。更新另一个ref?基本上是一个更新在另一个之上。当然,我不知道第一个是否成功。我没有意见——如果它按照你想要的方式工作,那就是个好主意。如果您有新问题,请单独发布,但请注意,征求意见与堆栈溢出无关。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.updateViewsCtAtPostsRef = functions.https.onRequest((request, response) => {

    const currentTimeStamp = Date.now();
    const receivedTimeStamp = admin.database.ServerValue.TIMESTAMP;

    const creditId = "sample_123";
    const userId = "userId_xyz";
    const gameId = "game_abc";
    admin.database().ref('user_credits').child(creditId).child(userId).once('value', snapshot => {

        if (!snapshot.exists()) {

            admin.database().ref('/games/' + gameId + '/' + 'score').set(admin.database.ServerValue.increment(1))
            .then(() => { 

                return admin.database().ref('/user_credits/' + creditId + '/' + userId).set({ "joined_date": receivedTimeStamp, "timeStamp": receivedTimeStamp, "credits_count": 1 })
                .then(() => { 
                    return true; 
                })
                .catch(error);
            })
            .catch(error);

        } else {

            const previousTimeStamp = snapshot.child("timeStamp").val();
            const creditsCount = snapshot.child("credits_count").val();

            if (previousTimeStamp + whatever) < currentTimeStamp {

                let updatedCount = creditsCount + 1;

                admin.database().ref('/games/' + gameId + '/' + 'score').set(admin.database.ServerValue.increment(1))
                .then(() => {

                    return admin.database().ref('/user_credits/' + creditId + '/' + userId).update({ "timeStamp": receivedTimeStamp, "credits_count": updatedCount })
                    .then(() => { 
                        return true; 
                    })
                    .catch(error);
                })
                .catch(error);

            } else {

               return true
            }
        }
    });
});