0

我一直在学习 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。我研究了回调,但无法理解各种答案中给出的示例,其中包含函数中的函数。

4

1 回答 1

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调用匿名函数时,使用传递的值调用obj
  4. 声明一个function2接受单个参数的新函数callbackFn
  5. callbackFn使用单个参数调用传递的值,obj我们从某个地方得到

所以申报顺序是1、4、2;执行顺序为 2、5、3。

*好吧,它们有点特别。它们的定义被提升,您可以执行它们所代表的代码,它们的声明创建范围闭包。但这些都是另一个问题。

于 2014-01-25T20:39:38.390 回答