2

私はいつもこれについて疑問に思っていましたが、説得力のある答えを見つけたことがありません。

次の場合を考慮してください。

var toAddress = '';
if(j==1)
{
  toAddress="abc@mydomain.com";
}
else
{
  toAddress="xyz@mydomain.com";
}

sendAlertEmail(toAddress);

sendAlertEmail() 関数が呼び出されるまでに、「toAddress」が入力されていることを確認できますか?

4

3 に答える 3

3

提供したサンプルのようなコードの場合:

var toAddress = '';
if(j==1)
{
  toAddress="abc@mydomain.com";
}
else
{
  toAddress="xyz@mydomain.com";
}

sendAlertEmail(toAddress);

厳密にシーケンシャルであることは間違いありません。つまり、 の値toAddressは または のいずれ"abc@mydomain.com""xyz@mydomain.com"です。

ただし、次のようなコードの場合:

var toAddress = '';
doSomething(function(){
  if(j==1)
  {
    toAddress="abc@mydomain.com";
  }
  else
  {
    toAddress="xyz@mydomain.com";
  }
});

sendAlertEmail(toAddress);

次に、関数doSomethingが非同期かどうかによって異なります。見つけるのに最適な場所はドキュメントです。2番目に良いのは、実装を見ることです。

が非同期でない場合、コードの実行は基本的にシーケンシャルであり、適切に入力されdoSomethingていることを確実に確認できます。toAddress

ただし、doSomethingが非同期の場合、通常、コードの実行がシーケンシャルではないと確信できます。これは、非同期関数の基本的な動作の 1 つであるため、すぐに戻り、後で渡された関数を実行します。

関数を操作するすべての関数が非同期であるとは限りません。同期関数の例はforEach、配列のメソッドです。ただし、すべての非同期関数は関数を引数として受け入れます。これは、非同期操作の最後にコードの一部を実行する唯一の方法だからです。そのため、関数を引数として取る関数を見たときはいつでも、それが非同期かどうかを確認する必要があります。

于 2013-03-16T17:54:12.797 に答える
0

あなたが書いたコードは、非同期の振る舞いを指摘するのに非常に簡単でした。このコードを見てください:

var toAddress = 'abc@mydomain.com';
if(j==1)
{ func1(toAddress); }
else
{ func2(toAddress); }
sendAlertEmail(toAddress);

sendAlertEmailがfunc1またはfunc2(if else条件付き)が実行された後にのみ実行されるという保証はありません。ノード内の関数は、呼び出されるとすぐに戻り、次に呼び出される関数を実行します。それらが順番に実行されることを確認したい場合は、コールバックを使用するか、asyncのようなライブラリを使用してください。

于 2013-03-16T18:00:05.737 に答える
0

Node.js はシングル スレッド (または少なくとも JS 実行) であるため、上記のコードはすべて同期的であり、すべてが同じティック中に発生するように並べられているため、順番に実行されるため、toAddress を入力する必要があります。

非同期関数を導入すると、事態は複雑になります。非同期の場合、ティックが行間で発生するため、変数が行間でシフトする可能性があります。

各ティック中に明確にするために、コードは実行の上から下に単純に評価されます。最初のティックでは、実行範囲はファイル全体ですが、その後はコールバックとハンドラーです。

于 2013-03-16T17:31:01.753 に答える