使用回调和调用方法之间的区别

时间:2015-11-19 10:28:57

标签: javascript function asynchronous callback

我是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

2 个答案:

答案 0 :(得分: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

我希望这会对你有所帮助

答案 1 :(得分:0)

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

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

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