JS:用于定义回调函数的常规结构?

时间:2017-08-28 23:36:38

标签: javascript asynchronous callback

我编写了一个简单的函数,一旦完成打印出某个字符串就会触发回调函数。在按照我的方式构建回调时,我应该注意哪些警告?

另外,如果原始函数受异步性影响,最好的方法是什么?

代码

// Output via console
var message = "hello there";

function typeOut(message, callback = null, i = 0) {
  var interval = setInterval(function() {
    if (i < message.length) {
      console.log(message.substring(0, i + 1));
      i++;
    } else {
      clearInterval(interval);
      callback();
    }
  }, 150);
  //callback;
}

function postDialog() {
  console.log('this is postdialog');
}

typeOut(message, postDialog);

小提琴 Here

1 个答案:

答案 0 :(得分:1)

两个警告:

  • 请勿使用() => {}作为默认值。调用时,这将不可避免地抛出异常。要么使用默认值,要求调用者提供函数,要么使用不执行任何操作的函数(例如i)作为默认值。
  • 回调应该始终是按惯例的最后一个参数。这使得调用具有较长回调的函数更好,因为调用的所有参数都放在连续符号上方的相同位置。
    鉴于您的i参数也是可选的,这可能并非易事。我能想到的潜在解决方法:
    • 根本不要让typeof成为参数 - 无论如何你还没有使用它。此外,在一个真实世界的用例中,您可以使用#34; animate&#34;一个DOM节点,它可以为动画节点添加一个常量前缀。
    • 将您的函数重载为具有多个签名,并根据i第二个参数决定其callback还是function delay(ms) { return new Promise(res => setTimeout(res, ms)); } async function typeOut(message, i = 0) { while (i < message.length) { await delay(150); i++; console.log(message.slice(0, i)); } } var message = "hello there"; typeOut(message).then(function postDialog() { console.log('this is postdialog'); }); 。但这确实很乏味。

总的来说,在现代代码库中编写新代码的建议当然是使用promises 而不是回调!他们将处理上述两个问题:

(?<!a)b