【问题标题】:Difference between using callbacks and calling methods使用回调和调用方法的区别
【发布时间】:2015-11-19 10:28:56
【问题描述】:

我对 Javascript 编程非常陌生,并且正在研究处理异步函数的方法。我遇到了非常有用的资源,其中将其列为示例:

var fs = require('fs')
var myNumber = undefined

function addOne(callback) {
    fs.readFile('number.txt', function doneReading(err, fileContents) {
        myNumber = parseInt(fileContents)
        myNumber++
        callback()
    })
}

function logMyNumber() {
    console.log(myNumber)
}

addOne(logMyNumber)

但是,这样做你能达到同样的结果吗:

var fs = require('fs')
var myNumber = undefined

function addOne() {
    fs.readFile('number.txt', function doneReading(err, fileContents) {
        myNumber = parseInt(fileContents)
        myNumber++
        logMyNumber()
    })
}

function logMyNumber() {
    console.log(myNumber)
}

addOne()

如果可以,使用回调的目的/优势是什么?

文章来自这里:https://github.com/maxogden/art-of-node#callbacks

【问题讨论】:

    标签: javascript function asynchronous callback


    【解决方案1】:

    当我们使用回调时,它取决于情况以使事情动态化或确保一段代码在完成后运行。在您当前的代码中已经描述了回调

    您的第一个示例清楚地说明了我们如何定义回调。

    在计算机编程中,回调是一段可执行代码,它作为参数传递给其他代码,期望在某个方便的时间回调(执行)该参数。调用可能像在同步回调中​​那样立即发生,也可能像在异步回调中那样在稍后发生

    var fs = require('fs')
    var myNumber = undefined
    

    您在此处使用回调,这使您能够在成功读取 number.txt 后运行不同的方法

    function addOne(callback) {
        fs.readFile('number.txt', function doneReading(err, fileContents) {
            myNumber = parseInt(fileContents)
            myNumber++
            callback()
        })
    }
    

    在您的第二个示例中,您没有直接调用 logMyNumber() 回调,如果我们需要运行另一个函数,例如

    function logMyNumber() {
        console.log(myNumber)
    }
    
    function varifynumber() {
        console.log(myNumber)
    }
    
    function somthingelse() {
        console.log(myNumber)
    }
    
    
    addOne(logMyNumber)
    addOne(somthingelse)
    addOne(logMyNumber)
    

    如果你注意到的话,JavaScript 中回调的另一个最佳用途是处理异步任务 在你的函数中,你正在使用 fs.readFile('number.txt',callback) 这是一个异步方法,请看下面的例子

    console.log('start');
     fs.readFile('number.txt', function doneReading(err, fileContents) {
              // until the file not read completely this section will not run 
              // this happend because of call back  
            console.log('Reading complete');
            })
    console.log('End');
    
    output :
    start
    End
    Reading complete
    

    希望对你有帮助

    【讨论】:

    • 很好的解释!我一天中的大部分时间都在玩回调,发现它们对非常不可预测的代码非常有帮助。很高兴看到使用的不同示例以及为什么直接调用不是一个好主意 - 谢谢!
    【解决方案2】:

    这完全取决于您要达到的目标。在第一个示例中,函数addOne 对回调参数的作用没有概念,它只是调用它。

    但是,在第二种情况下,addOne 函数知道它将调用 logMyNumber,因此具有更紧密的耦合和对到底发生了什么的概念。

    第一个例子在大多数情况下通常是有利的,例如如果您将函数拆分到多个文件中,并且不希望它们紧密交织在一起。

    【讨论】:

    • 我明白了,那么对于第二个示例,您是否仍然能够在调用 logMyNumber 之前先完成 readFile 函数?
    • 在调用fs.readFile之后,程序刚刚恢复,并且在将来的某个时候,您提供给函数的第二个参数将执行。我已经对您的示例进行了一些格式化以使其更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多