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

时间:2013-12-30 20:52:28

标签: 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%的时间花在节点上用于回调调试。我已经构建了一些不错的应用程序但是所有内容都是通过异步库处理的,因为我有这个心理块。

感谢。

5 个答案:

答案 0 :(得分:3)

您犯的第一个错误是RandHash没有返回任何内容。函数中没有return语句,因此var anything = RandHash(alsoAnything)始终会导致anything未定义。

函数是第一类变量

函数可以像变量一样使用,并作为参数传递给函数。这是javascript的一个强大功能,你需要一些东西来使用回调。将某个函数视为已定义的操作,您只需将该操作传递给它。

此外,应使用回调来处理流程的完成。所以我们的想法是,你知道在进程A之后发生了什么,以及它要生成什么,所以你可以给进程A一个回调,一旦A终止就会被调用。现在这里的场景不适合回调情况。这样你会更容易......

function RandHash () {
  return Math.floor((Math.random()*10000)+1);
}

然后通过调用此函数来获取您的哈希,就像这样......

var hash = RandHash();

您还希望了解javascripts变量作用域,因为在ds_hash函数中引用RandHash时缺少var关键字,这意味着赋值默认为全局作用域。这可能是导致您感到困惑的原因,因为您在ds_hash中对RandHash的分配将是全局的,因此可以在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类)。

答案 1 :(得分:3)

要真正理解异步行为,你应该尝试使用实际上异步的东西,并传递值,而不仅仅是一个全局变量,因为当你转向异步函数时它永远不会工作:

function RandHash (callback) {
    setTimeout(function() {
        var ds_hash = Math.floor((Math.random()*10000)+1); 
        callback(ds_hash); // execute callback when async operation is done
    }, 300);
}

function CompiledHash(hash){ // pass hash
  console.log(hash);
}

RandHash(function(returned_hash) { // this is the callback function 
    CompiledHash(returned_hash);   // pass along the returned data
});

一旦异步函数(在本例中为setTimeout)完成,就会执行回调函数,并将数据作为参数传回。
回调参数只是作为参数传递的函数。

// regular function
function doStuff(argument) {
    // where argument can be anything, also a function
}

// you can pass a string
doStuff('string');

// or a function
doStuff(function(argument_returned) {

});

// and passing a function you can execute that function with arguments in the original function
function doStuff(argument) {
     var argument_returned = 'string';
     argument(argument_returned); // executes the passsed function

});

答案 2 :(得分:1)

试试这个:

function RandHash (callback) {
  ds_hash = Math.floor((Math.random()*10000)+1); 
  callback(ds_hash);
}

function CompiledHash(ds_hash){
  console.log(ds_hash);
}

var ds_hash;
RandHash(CompiledHash);

对于回调函数和函数,理解变量作用域有点困难,并且不建议你做什么。你可以将参数传递给回调,并且应该通过,但我建议像这样构建它:

function RandHash (callback) {
  var ds_hash = Math.floor((Math.random()*10000)+1); 
  callback(ds_hash);
}

function CompiledHash(ds_hash){
  console.log(ds_hash);
}

RandHash(CompiledHash);

答案 3 :(得分:1)

一对夫妇注意到:

  1. 如果您想宣传callback的结果,则需要在return

  2. RandHash输出
  3. 如果您计划将其返回,则无需ds_hash成为全局变量

  4. RandHash(Compiled Hash);是语法错误(请注意变量名称中的空格)

  5. 试试这个:

    function RandHash(callback) {
        var ds_hash = Math.floor((Math.random() * 10000) + 1); 
        return callback(ds_hash);
    }
    
    function CompiledHash(ds_hash) {
        console.log(ds_hash);
        return ds_hash;
    }
    
    RandHash(CompiledHash);
    

    请注意,没有全局变量。 callback返回一个值,执行callback的函数将其传递。

    在样式注释中,您应该只将您打算用作构造函数的函数的名称大写。

答案 4 :(得分:0)

这样做

function RandHash (callback) {
 var  ds_hash = Math.floor((Math.random()*10000)+1); 
  callback(ds_hash);
}

var CompiledHash = function (ds_hash){
  console.log(ds_hash);
}


RandHash(CompiledHash);