javascript - 分配给变量的基本 node.js 回调

标签 javascript node.js

总的来说,我一直在为回调而苦苦挣扎。我试图回到基础知识,尝试从概念上理解,这就是我目前所理解的(是的,基本的)。

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/

相关文章:

javascript - 具有全选的多个复选框

javascript - promise -如何使异步代码在没有异步/等待的情况下同步执行?

node.js - 无法加载c++ bson扩展,使用纯JS版本

mysql - 对父属性找到的按天对象排序查询组

node.js - 将变量从 node.js 返回到 sh 脚本

javascript - SlideToggle 正在 Accordion 末端创建摆动

javascript - float 条形图中的不同颜色条,这可能吗?

javascript - 不同的 *Target 属性的目的是什么?

javascript - 使用 HTTPS GET 请求的结果 [Node.js]

javascript - 如何通过 Google Identity Toolkit 修改登录按钮? ( Node .js)