0

私は nodejs を学んでいますが、引き続き頭を悩ませていることの 1 つは、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 では undefined として出力されるのに対し、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呼び出されると、引数を 1 つ指定して呼び出す、引数function2を取る新しい名前のない関数obj
  3. 匿名関数が呼び出されるとき、console.log渡された値で呼び出しますobj
  4. function2単一の引数を取る新しい関数を宣言するcallbackFn
  5. 渡された値をcallbackFn単一の引数で呼び出します。objどこかから取得しました

したがって、宣言の順序は 1、4、2 です。実行順序は 2、5、3 です。

*OK、それらは少し特別です。それらの定義は巻き上げられ、それらが表すコードを実行でき、それらの宣言はスコープクロージャーを作成します。しかし、それらはすべて別の機会に質問します。

于 2014-01-25T20:39:38.390 に答える