javascript - 使用变量传递回调

标签 javascript node.js timer callback

嘿,我认为这是个好主意, 不知怎的,它不起作用。我能让它发挥作用吗? 或者这被认为是不好的做法?

我有一种数学类应用程序,老师可以将问题发送给学生,然后他们回答。

想法是:在问题显示之前倒计时5秒, 然后发送问题, 然后倒计时以跟踪学生使用的最长时间。

我认为我不需要两个单独的倒计时函数,因为我只需传入两个函数(一个包含每个刻度要执行的操作,另一个是实际的 cb)。

但它崩溃了未定义计数

有什么提示吗?

socket.on('sendTestProblem', function(msg) {
    countdown(function() {
        socket.broadcast.to(socket.room).emit('timer', { countdown: count });  // crash on this line
      },
      function broadcastProblemToStudents() {
      socket.broadcast.to(socket.room).emit('testProblem', {problem: msg.problem, timeLimit: timeLimit});
      socket.emit('problemSentToStudents');

      // after pre-countdown, start countdown for max answering time
      countdown(function countdownForAnswers() {
        io.in(socket.room).emit('timeLimit', {timeLimit: count});
      }, function timeOver() {
        io.in(socket.room).emit('timeOver');
      }, msg.timeLimit);
    })
  });

  function countdown(emit, cb, timeLimit) {
    console.log('countdown');
    var count = timeLimit || COUNTDOWN;
    var countdown = setInterval(function() {
      emit();  // emit this on every tick
      count--;
      if (count == 0) {
        clearInterval(countdown);
        cb();  // call this on 0
      }
    }, 1000);
  }

最佳答案

您在倒计时函数的范围内声明了计数变量,并且它对于“emit”回调不可见。您应该将其作为参数传递或在共享范围中声明

    countdown(function(count) {
            socket.broadcast.to(socket.room).emit('timer', { countdown: count });
          },
...

    emit(count);

关于javascript - 使用变量传递回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119201/

相关文章:

javascript - 如何将 'x' 个 <td> 元素添加到 for 循环中的 <tr> 元素中? [jQuery]

javascript - 使用 jQuery setTimeout 在多个元素上更改类的设定时间量

angularjs - 你如何在 Windows 7 上安装 Angular

node.js - 处理来自 process.stdout 'data' 事件的分块响应

android - 每隔几个小时运行一次任务

c - C中实现mac地址表条目老化的数据结构

Javascript 表单提交到带有目标的弹出窗口

javascript - 删除数组中的重复对象

node.js - Cloudinary node.js的上传进度

java - 相当于Android中的javax.swing.Timer