Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 can';无法从firebase函数中获取setState_Javascript_Reactjs_Firebase_React Native - Fatal编程技术网

Javascript can';无法从firebase函数中获取setState

Javascript can';无法从firebase函数中获取setState,javascript,reactjs,firebase,react-native,Javascript,Reactjs,Firebase,React Native,首先,我将listaa设置为全局变量 我试图从设置它的firebase函数中取出变量(数组)“listaa”。。。我打算以后用它做一些数学题。 我在firebase函数中使用了console.log(listaa),它工作了, 但是当我尝试在firebase函数之外使用它()时,它就不起作用了。 我试图使用setState使其在外部可用,但也不起作用 if (funcionar == 0) { //=========================================

首先,我将
listaa
设置为全局变量
我试图从设置它的firebase函数中取出变量(数组)“listaa”。。。我打算以后用它做一些数学题。 我在firebase函数中使用了
console.log(listaa)
,它工作了, 但是当我尝试在firebase函数之外使用它()时,它就不起作用了。 我试图使用setState使其在外部可用,但也不起作用

if (funcionar == 0) {
        //============================================================== ANTES ===================================================
        var newRef = firebase
          .database()
          .ref()
          .child("TransferenciasPraVendedores/")
          .push({
            vendedor: vend,
            dia: functions.dataHoje(),
            hora: functions.horaHoje()
          });


        var fire = database.ref("EstoqueCadaVendedor/" + vend);
        fire.once("value", snap => {
          items = [];
          snap.forEach(data => {
            items.push({
              key: data.key,
              data: data.val()
            });
          });
          console.log("items:");
          console.log(items);

          for (j = 0; j < prod.length; j++) {
            // var a = parseInt(snap.val().quantidade);
            console.log("d: " + items[j].data);
            listaa.push(items[j].data);
          }
          // this.setState({ lista:listaa })
          // console.log("lista:");
          // console.log(this.state.lista[2]);
          console.log("listaa");
          console.log(listaa);
        });
        console.log("listaaaaaaaaaaaaaa");
        console.log(listaa);
if(funcionar==0){
//===================================================================================================================================================================================================================================================
var newRef=firebase
.数据库()
.ref()
.child(“转让人/卖方”)
.推({
卖方:卖方,
dia:functions.dataHoje(),
hora:functions.horaHoje()
});
var fire=database.ref(“estoquecadavendor/”+vend);
一次触发(“值”,捕捉=>{
项目=[];
snap.forEach(数据=>{
推({
key:data.key,
数据:data.val()
});
});
console.log(“项:”);
控制台日志(项目);
对于(j=0;j
我将在此处使用“listaa”:

        for (i = 0; i < prod.length; i++) {
          firebase
            .database()
            .ref()
            .child("EstoqueCadaVendedor/" + vend + "/")
            .update({
              [prod[i].key]: parseInt(quantNova[i]) + listaa[i]
            });
        }

        // this.setState({ quantidade: [], vendedor: "" });
      }
for(i=0;i
您是否查看了日志消息的顺序?如果仔细观察,您会发现数据在流程的后面部分可用。您可能需要使用async/promise等待数据可用,或者可以使用回调函数

异步的

函数以确保在使用前列表中的数据可用

异步函数可以包含一个等待表达式,用于暂停 执行函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值

在下面的示例中,我传递了一个回调函数,该函数在数据可用时被调用:

  export function listReleases(callback) {
  //console.log("hello from list releases ");
  releasesRef.once("value").then(
    function(snapshot) {
      const releases = snapshot.val();
      if (releases) {
        callback("releases", releases);
      }
    },
    function(error) {
      // The Promise was rejected.
      console.error(error);
    }
  );
}

+++++++++++++++++++++++++++


 //call the function to get the data and pass a call back function 
 releases = listReleases(this.myCallback);


 myCallback = (key, value) => {
   //do whatever you need to do in here 
 };

您是否查看了日志消息的顺序?如果仔细观察,您会发现数据在流程的后面部分可用。您可能需要使用async/promise等待数据可用,或者可以使用回调函数

异步的

函数以确保在使用前列表中的数据可用

异步函数可以包含一个等待表达式,用于暂停 执行函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值

在下面的示例中,我传递了一个回调函数,该函数在数据可用时被调用:

  export function listReleases(callback) {
  //console.log("hello from list releases ");
  releasesRef.once("value").then(
    function(snapshot) {
      const releases = snapshot.val();
      if (releases) {
        callback("releases", releases);
      }
    },
    function(error) {
      // The Promise was rejected.
      console.error(error);
    }
  );
}

+++++++++++++++++++++++++++


 //call the function to get the data and pass a call back function 
 releases = listReleases(this.myCallback);


 myCallback = (key, value) => {
   //do whatever you need to do in here 
 };
团长在这里

  • 之所以看不到它,是因为您的代码是异步的,所以在最后打印console.log()时。firebase调用尚未完成。这是典型的竞争条件场景
  • 仅供参考,我个人更喜欢使用promise样式,而不是回调,我认为它使代码更干净,更易于阅读。试试这个:

    让firebaseDB=firebase.database()

    如果(函数==0){

    返回firebaseDB.ref(“transferencispravendedores/”)
    .推({
    卖方:卖方,
    dia:functions.dataHoje(),
    hora:functions.horaHoje()
    })
    .然后(()=>{
    返回firebaseDB.ref(“estoquecadavendor/”+vend).once('value');
    。然后(快照=>{
    让snap=snapshot.val();
    项目=[];
    snap.forEach(数据=>{
    推({
    key:data.key,
    数据:data.val()
    });
    });
    返回{snap,items};
    })
    .then({snap,items}=>{
    对于(j=0;j{
    抛出错误
    }
    
让我知道它是否有用。我可以更深入地研究它。Saludos:)

这里的Tuan