我是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
答案 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
,因此它具有更紧密的耦合和概念。
在大多数情况下,第一个例子通常是有利的,例如如果你在多个文件中分割功能,并且不希望它们紧密交织在一起。