【问题标题】:fcm firebase function undefined value - first attempt, defined - second attemptfcm firebase 函数未定义值 - 第一次尝试,已定义 - 第二次尝试
【发布时间】:2019-12-15 22:14:34
【问题描述】:

我有一个 Android 应用程序,我打算通过 fcm 实现发送通知。我已经为它编写了下面的 Javascript 代码,但是当我第一次尝试关注某人时,这些值是未定义的,但是,第二次它可以正常工作...

Undefined first attempt

Defined second attempt

我尝试将这三个函数嵌套在一个函数中,还尝试在本地声明变量但未解决。


"use-strict"
const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();

var notificationDB;
var followedUserRef;
var followingUserRef;
var followingText;
var followingImageProfile;
var followedDToken_id;
var following;
var followingFullname;
exports.sendNotification =functions.database.ref("Notifications/{followed}/{notification_id}").onWrite((snapshot,context)=>{
    const followed = context.params.followed;
    const notification_id = context.params.notification_id;

    notificationDB = admin.database().ref(`Notifications/${followed}/${notification_id}`);
    console.log("Notification DB : "+notificationDB);
    notificationDB.on("value",(snapshotOne)=>{
        following = snapshotOne.val().userid;      
        followingText = snapshotOne.val().text;
    });

    followedUserRef = admin.database().ref(`Users/${followed}`);
    followedUserRef.on("value",(snapshot)=>{
        if(snapshot.val().token_id===null){
            followedDToken_id = "null";
        }else
        followedDToken_id = snapshot.val().token_id;   
    });

    followingUserRef = admin.database().ref(`Users/${following}`);
    followingUserRef.on("value",(snapshot)=>{
        followingFullname = snapshot.val().fullname;   
        followingImageProfile = snapshot.val().imageurl;   
    });

    console.log("Following: "+following);
    console.log("Followed: "+followed);
    console.log("followed user Ref: "+followedUserRef)
    console.log("NAME: "+followingFullname);
    console.log("FOLLOWING TEXT: "+followingText);
    console.log("tokken: "+followedDToken_id);
    console.log("IMAGE: "+followingImageProfile);
});

预期的结果应该在第一次尝试时显示,但第一次失败并在第二次获取值。

【问题讨论】:

    标签: javascript android node.js firebase


    【解决方案1】:

    您的代码并没有像您预期的那样完全按顺序执行,有请求发送到服务器,您需要在回调中记录控制台日志。例如这里

    notificationDB = admin.database().ref(`Notifications/${followed}/${notification_id}`);
    console.log("Notification DB : "+notificationDB);
    notificationDB.on("value",(snapshotOne)=>{
        following = snapshotOne.val().userid;      
        followingText = snapshotOne.val().text;
    });
    

    following 只会在响应时初始化,这将在您控制台日志后执行。因此,您需要根据以下原则重构代码:

    • 你初始化你的变量
    • 然后调用发送请求的函数
    • 在回调中执行控制台日志

    使用 Promise API 会更优雅。

    【讨论】:

    • 我真的很抱歉,但我没有明白你的意思。请用示例代码解释。 idk javascript 很多,我只是尝试到这里。
    • 这不仅仅是将它们记录在控制台中。它不会在第一次尝试发送通知,而是在第二次发送
    • @Amanullah 之类的 (snapshotOne)=>{/*...*/} 被称为箭头函数,在这种情况下它们是回调。回调不是特定于 Javascript 的,如果您搜索它们,您可以阅读它们。现在,完全有可能在第一次“写入”时没有响应请求。很高兴看到在需要发送通知的时间执行回调的时间。您所说的行为可能是一些未完成的事情。 codeburst.io/…
    • 所以在这种情况下我正确使用了回调,因为直到它没有初始化值,它不会完成对吗?那么为什么在运行这个函数之后仍然没有定义值。 @Lajos Arpad
    • @Amanullah 这些值在回调执行后被初始化。您似乎打算在执行回调之前获取值。请尝试我在之前评论中描述的日志记录想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多