Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.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 fcm firebase函数未定义值-第一次尝试,已定义-第二次尝试_Javascript_Android_Node.js_Firebase - Fatal编程技术网

Javascript fcm firebase函数未定义值-第一次尝试,已定义-第二次尝试

Javascript fcm firebase函数未定义值-第一次尝试,已定义-第二次尝试,javascript,android,node.js,firebase,Javascript,Android,Node.js,Firebase,我有一个Android应用程序,我打算通过fcm实现发送通知。我已经为它写了下面的Javascript代码,但是当我第一次尝试跟踪某人时,这些值是未定义的,然而,第二次它完全按照预期工作 我尝试将这三个函数嵌套在一个函数中,还尝试在局部声明变量,但没有解决 "use-strict" const functions = require('firebase-functions'); const admin = require("firebase-admin"); admin.initializ

我有一个Android应用程序,我打算通过fcm实现发送通知。我已经为它写了下面的Javascript代码,但是当我第一次尝试跟踪某人时,这些值是未定义的,然而,第二次它完全按照预期工作

我尝试将这三个函数嵌套在一个函数中,还尝试在局部声明变量,但没有解决


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

第一次尝试时应显示预期结果,但第一次失败,第二次获得值。

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

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;
});
以下内容仅在响应时初始化,响应将在您登录控制台后执行。因此,您需要根据以下原则重构代码:

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

更优雅的做法是使用Promise API。

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

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;
});
以下内容仅在响应时初始化,响应将在您登录控制台后执行。因此,您需要根据以下原则重构代码:

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

更优雅的是使用Promise API。

我真的很抱歉,我没有理解你的意思。请用示例代码解释。idk javascript很多,我只是尝试到这里。这不仅仅是在控制台中记录它们。第一次尝试时它不会发送通知,但会发送通知second@Amanullah像(snapshotOne)=>{/*…*/}这样的函数称为箭头函数,在本例中,它们是回调函数。回调不是特定于Javascript的,如果搜索它们,您可以了解它们。现在,完全有可能在第一次“写”时请求没有得到响应。在需要发送通知的时间内执行回调,这将是非常好的。可能是一些未完成的工作导致了你所谈论的行为。所以在本例中,我正确地使用了回调,因为在它没有初始化值之前,它不会完成,对吗?那么为什么在运行这个函数之后,仍然没有定义值呢@拉霍斯Arpad@Amanullah这些值是在执行回调后初始化的。似乎您打算在执行回调之前获取这些值。请尝试一下我在之前的评论中描述的日志想法。我真的很抱歉,我没有理解你的意思。请用示例代码解释。idk javascript很多,我只是尝试到这里。这不仅仅是在控制台中记录它们。第一次尝试时它不会发送通知,但会发送通知second@Amanullah像(snapshotOne)=>{/*…*/}这样的函数称为箭头函数,在本例中,它们是回调函数。回调不是特定于Javascript的,如果搜索它们,您可以了解它们。现在,完全有可能在第一次“写”时请求没有得到响应。在需要发送通知的时间内执行回调,这将是非常好的。可能是一些未完成的工作导致了你所谈论的行为。所以在本例中,我正确地使用了回调,因为在它没有初始化值之前,它不会完成,对吗?那么为什么在运行这个函数之后,仍然没有定义值呢@拉霍斯Arpad@Amanullah这些值是在执行回调后初始化的。似乎您打算在执行回调之前获取这些值。请尝试一下我在之前的评论中描述的日志想法。