【问题标题】:Why do we need callback instead of calling directly inside the function? in JS为什么我们需要回调而不是直接在函数内部调用?在 JS 中
【发布时间】:2020-09-30 17:04:08
【问题描述】:

我刚刚意识到我对 javascript 的了解不够,尽管我已经编写了一段时间的代码。

我不习惯的是 Javascript Async。

到目前为止,我一直在使用回调和承诺,因为文档和教程如下所示。

$.get("some/url", function() {
    // callback body
})

axios.get('some/url').then(res => {
    console.log(res.data);
});

arr.map(element => console.log(element))

我知道回调用于我的代码异步

function doSomething(cb) {
  console.log("this function receives callback function");
  cb();
}

但是如果我们只是手动调用函数内部的函数呢

function func1() {
  // function body
}
function doSomething() {
  console.log("this function receives callback function");
  func1();
}

我的想法是只要在正确的时间调用函数,我们就不必使用回调。 还是因为回调在其他一些操作正在进行时起作用? 如果是这样,它是否打破了javascript作为单线程的原则? 因为它同时做两件事。

此外,人们是否因为它的可读性而使用 Promise 而不是回调函数,你可以使用 Promise.all() 吗? 我觉得我错过了使用 Promise 的核心优势。

请帮助我更好地理解。

【问题讨论】:

  • 您传递一个回调,以便您可以在异步操作完成后配置“接下来会发生什么”,而不是将异步函数硬编码为执行特定操作。 (虽然回调必须与异步有任何关系,例如查看数组mapforEach。)
  • 至于 promise 的优点,那是一个单独的问题,所以应该单独问。网上有很多资源,我建议你用谷歌搜索,如果你同时使用这两种资源足够长的时间,imo 的优势就会变得非常明显。

标签: javascript promise callback


【解决方案1】:

如果不使用回调,则只能调用func1()。原来的doSomething() 更通用,因为你可以根据调用者的需要调用不同的函数。

function func1() {
    // function body
}
function func2() {
    // function body
}

doSomething(func1);
doSomething(func2);

【讨论】:

    【解决方案2】:

    这正是代码中硬编码数据或动态获取数据之间的区别。

    例如,在后端编写代码,以便它可以满足不同用户的不同需求......同时,相同的代码......

    所以在这个例子中:

    function doSomething(cb) {
      console.log("this function receives callback function");
      cb();
    }
    

    您可以构建一个函数,根据接收到的 cb 为不同的用户提供不同的信息...

    在这个例子中:

    function func1() {
      // function body
    }
    function doSomething() {
      console.log("this function receives callback function");
      func1();
    }
    

    它只是运行一个特定的函数 func1 就是这样

    【讨论】:

      【解决方案3】:

      一切都与可重用性有关。如果您调用将回调传递给实用函数,在您的示例中是 doSomething,您将无法在程序的其他部分重用 doSomething 函数。您刚刚创建了两个函数之间的紧密耦合。

      如果您对界面进行编程,并在 doSomething 函数中定义您期望的回调类型,您将能够在任何地方使用此 doSomething 函数。它不必知道要调用哪个确切的函数,它只关心有一个回调,该回调需要 n 个参数以某种顺序。

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 2018-01-03
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 2021-05-02
        • 2013-09-26
        • 2012-08-04
        • 2020-11-22
        相关资源
        最近更新 更多