顺序回调的javascript练习

羚羊

我正在学习javascript,并从一本书中重写了以下代码:

var controller = {};
controller.queue=[];
controller.add = function (func) {
                  controller.queue.push(func);
                 };
controller.run = function () {
                  controller.queue.shift() (controller.run);
                  
                 }

function longRunA(callback){
  console.log("A");
  setTimeout(callback,2000);
}
function longRunB(callback){
  console.log("B");
  setTimeout(callback,1000);
}

controller.add(longRunA);
controller.add(longRunB);
controller.run();

打印输出是正确的,在B之后两秒钟A,这是他必须要做的。

有些事情我不清楚。

  1. 为什么controller.run打电话后在括号里controller.queue.shift ()我不知道是否已完成使函数递归的操作,也不了解周围的括号的作用controller.run控制台报告此问题:uncaught typeerror: controller.queue.shift (..) is not a function at controller.run
  2. controller.add带有longRunA参数调用,但是我不明白为什么longRunA不带参数调用函数是正确的我会在函数定义中删除单词callback。
优素福

Javascript中的函数可以是:

  • 传递给其他函数作为参数
  • 从另一个函数内部返回
  • 保存在数组之类的数据结构中
  • 分配给变量

有关更多详细信息,请参见: MDN - First-Class Function


涉及有关代码的不同问题。

为什么在调用controller.queue.shift()之后在括号中写出controller.run

如果controller.queue.shift()返回一个函数,则可以通过在其后面添加括号来调用它,就像其他任何函数一样,您可以向其传递参数。在这种情况下,controller.run作为参数传递给由返回的函数controller.queue.shift()

以下代码段显示了一个示例:

function sayHi(name) {
  console.log("Hi " + name + "!");
}

const arr = [sayHi];

arr.shift()("John");

在上面的代码片段中,arr.shift()返回sayHi我们随后使用括号调用函数,()并将“ John”作为参数传递。

控制台报告此问题:未捕获的类型错误:controller.queue.shift(..)不是controller.run中的函数

之所以会出现此错误,是因为在longRunB函数内部调用了该callback函数,即,controller.run但是在调用该函数时,它尝试获取controller.queue数组的第一个元素,但此时它为空。

解决此问题的一种方法是确保controller.queue.shift()在尝试调用它之前为您提供了一个函数。

用longRunA参数调用controller.add,但是我不明白为什么不带参数调用longRunA函数是正确的

controller.addlongRunA要作为参数传递给的函数。longRunA在这里没有被调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章