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