如何处理nodejs中的异步函数

时间:2014-01-25 20:22:51

标签: javascript asynchronous first-class-functions

我一直在学习nodejs,并且继续让我头脑发昏的一件事是构建了nodejs的异步编程。也许我做错了什么,但尽管我进行了所有研究,但我无法理解我应该如何从同步编程背景中适应它。如果有人给我一个基于以下结构的简单异步示例,我真的很感激,因为你想从任何地方调用func2。

function1(){
  var obj = function2();
  console.log(obj); //"undefined".
}

function2(){
  //do stuff with DB and get obj
  console.log(obj); //logs obj.
  return obj;
}

我偶然发现的问题是obj在func1中打印为未定义,而func2没有问题。当我将函数嵌套在彼此中时,它工作,让我相信由于nodejs的异步性质,它在func2完成之前继续登录func1。我的假设错了吗?

我在上面的例子中苦苦思索的是如何编写函数而不是将它们嵌套在一起,所以我可以一次从几个不同的函数调用func2。我已经查看了回调,但无法理解函数内部函数的各种答案中给出的示例。

1 个答案:

答案 0 :(得分:0)

您必须在函数中定义函数(即回调函数)。

1  function function1(){
2    function2(function(obj) {
3      console.log(obj); //logs obj.
     });
   }

4  function function2(callbackFn){
     //do stuff with DB and get obj
     console.log(obj); //logs obj.
5    callbackFn(obj);
   }

function2可以同时从多个地方调用,而不只是function1

如果您可以更明确地了解您不理解的内容,那么您可能会得到更好的答案。


函数是值,就像数字,字符串和对象一样。

这是函数式编程的核心基础,也可能是你没有掌握的东西。在JavaScript中,与许多语言一样,函数并不特殊*。这与C或Java等语言不同,其中函数/方法与您在代码中处理的常用值不同。

2; // Here is a number
var a = 2; // I can assign it to a variable
console.log(2); // I can pass it as a function argument

function() {} // Here is a function
var a = function() {}; // I can assign it to a variable
console.log(function() {}); // I can pass it as a function argument

function jim() {} // This function's name is jim
var a = jim; // I can assign it to a variable
console.log(jim); // I can pass it as a function argument

(function() {})(); // I can call a function without giving it any names
jim(); // I can call a named function
a(); // I can call a function via a variable
jim.call(this, arg1); // Or I can get complicated

因此,我们可以声明函数并将它们分别传递给它们。现在,我们开始使用的代码如何。

  1. 声明一个名为function1的新函数,该函数不带参数
  2. 调用function1时,使用单个参数调用function2,使用obj参数的新无名函数
  3. 调用匿名函数时,使用为console.log
  4. 传递的值调用obj
  5. 声明一个名为function2的新函数,该函数只接受一个参数callbackFn
  6. 使用单个参数调用callbackFn传递的值,我们从某个地方获取obj
  7. 因此声明顺序为1,4,2;并且执行顺序是2,5,3。

    *好吧,他们有点特别。他们的定义是hoisted,您可以执行他们代表的代码,他们的声明创建scopeclosures。但这些都是另一个问题。