总的来说,我一直在为回调而苦苦挣扎。我试图回到基础知识,尝试从概念上理解,这就是我目前所理解的(是的,基本的)。
function RandHash (callback) {
ds_hash = Math.floor((Math.random()*10000)+1);
callback();
}
function CompiledHash (){
console.log(ds_hash);
}
var ds_hash;
RandHash(Compiled Hash);
将产生随机数。
但是,我不知道如何从回调中获取返回的“ds_hash”变量。
这似乎行得通:
var ds_hash;
ds_hash = RandHash(Compiled Hash);
事实并非如此。如果我尝试返回类似这样的值:
function CompiledHash (){
return ds_hash;
}
它什么都不做。
请帮我解决这个问题。似乎我 90% 的时间都花在了 Node 回调调试上。我已经构建了一些不错的应用程序,但由于我的这种心理障碍,所有事情都是通过异步库处理的。
谢谢。
最佳答案
您犯的第一个错误是 RandHash
没有返回任何内容。函数中没有 return
语句,因此 var anything = RandHash(alsoAnything)
将始终导致 anything
未定义。
函数是一等变量
函数可以像变量一样使用,并作为参数传递给函数。这是 javascript 的一个强大功能,您需要了解它才能使用回调。将函数视为已定义的操作,您只是传递该操作。
此外,回调应该用于处理流程的完成。所以这个想法是,你知道在进程 A 之后要发生什么,以及它要生成什么,所以你可以给进程 A 一个回调,一旦 A 终止就会调用它。现在这里的场景不适合回调情况。你这样做会容易得多......
function RandHash () {
return Math.floor((Math.random()*10000)+1);
}
然后通过调用这个函数来获取你的散列,就像这样......
var hash = RandHash();
您还需要注意 javascripts 变量作用域,因为在 RandHash
函数中引用 ds_hash
时缺少 var 关键字,这意味着赋值默认为全局范围。这可能是让您感到困惑的原因,因为您在 RandHash
中分配的 ds_hash
将是全局的,因此在 CompiledHash
中可用,这意味着一些函数尽管这不是正确或正确的方法,但仍将能够访问 ds_hash
值。
假设你最终会需要异步处理
function randHash (callback) {
var hash = /* do hash calculation */
callback(hash);
}
function compileHash (hash) {
/* do something using the hash variable passed to this function */
}
randHash(compileHash); // pass the compileHash function as the callback
您应该将您的变量作为参数传递给回调。这将有望解决您的范围界定问题。
此外,请注意,如果 javascript 中的函数不打算与 new
语句(即 javascript 类)一起使用,则它们通常应为小写。
关于javascript - 分配给变量的基本 node.js 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847363/