javascript - 如何在 JavaScript 中顺序执行代码

标签 javascript

我遇到了问题。我正在编写一个方法,首先检查用户是否存在并带有条件,如果不存在,它将插入操作,并且我正在使用标志变量来控制流程。但有一个问题,异常不是按顺序出现的,而是先下降,然后 if(!flag) 上升,检查用户是否存在

analysis = actionid => {
  //check if it is't the first command
  console.log("before definition of flage");
  var flag = false;
  console.log("hiii");
  firebase
    .database()
    .ref("userActions/")
    .once("value", snap => {
      console.log("iafter definition ");
      snap.forEach(child => {
        if (
          child.val().userID === firebase.auth().currentUser.uid &&
          child.val().ActionID == actionid
        ) {
          plus = parseInt(child.val().Repetition) + 1;
          console.log("before first use");
          flag = true;
          firebase
            .database()
            .ref(child)
            .set((Repetition = plus))
            .then(() => {
              console.log("inserted the update");
            })
            .catch(error => {
              console.log(error);
            });
        }
      });
    });

  console.log("before second use");
  if (!flag) {
    console.log("inside second use");
    var userActionKey = firebase
      .database()
      .ref()
      .child("userActions")
      .push().key;
    firebase
      .database()
      .ref("userActions/" + userActionKey)
      .set({
        userID: firebase.auth().currentUser.uid,
        ActionID: "001",
        time: "12",
        Repetition: "1"
      })
      .then(() => {
        console.log("inserted");
      })
      .catch(error => {
        console.log(error);
      });
  }
};

最佳答案

JavaScript 同步运行代码。要解决该问题,您可以使用 promisesasync-await 异步运行代码。或者您可以在第一个进程中调用一个函数。

下面的代码应该可以工作。

function doSomething() {
    var userActionKey =firebase.database().ref().child('userActions').push().key;
    firebase
        .database()
        .ref('userActions/'+userActionKey)
        .set({
            userID:firebase.auth().currentUser.uid,
            ActionID:'001',
            time:'12',
            Repetition:'1',
        }).then(() => {
            console.log('inserted')
        }).catch((error)=> {
            console.log(error)
        });
};


firebase.database().ref('userActions/').once ('value',(snap)=>{ 
    snap.forEach((child)=>{
        if(child.val().userID===firebase.auth().currentUser.uid && child.val().ActionID== actionid) {
            plus=parseInt(child.val().Repetition)+1;
            firebase
                .database().ref(child).set(Repetition=plus)
                .then(() => {
                    console.log('inserted the update');
                }).catch((error)=>{
                    console.log(error);
                }).finally(() => {
                    doSomething();
                });
        }
    });
});

我希望这个例子能向您展示逻辑。

我强烈建议您学习 JavaScript 中的promises

关于javascript - 如何在 JavaScript 中顺序执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60764731/

相关文章:

javascript - 单击按钮时发出警报

javascript - 用户在文本框中按下回车的 JQuery 事件?

javascript - AngularJS 更改 URL 但不查看

javascript - 如何在 Firebase 中获取元素/列表的大小而不获取全部?

javascript - d3js 奇怪的日期和数据处理

javascript - Angular.js ng-view忽略路由

javascript - IE6 出现 "Access is denied"错误

javascript - 如何使用angularjs json数据为选择2下拉菜单设置默认值

javascript - 如何根据 HighCharts 中的 x 轴类别调整条形图的大小

javascript - jQuery 在匿名函数定义中使用 on() 附加点击处理程序