2
function placeOrder(orderNo) {
console.log("Order is: " + orderNo);

setTimeout(deliver(orderNo),5000);
}

function deliver(orderNo) {
    console.log("Item is delivered with Order No.- " + orderNo);
}

placeOrder(1);
placeOrder(2);
placeOrder(3);
placeOrder(4);
placeOrder(5);
placeOrder(6);

上記のコードは nodejs コードであり、その出力は次のようになります。

order No:1
order No:2
order No:3
order No:4
order No:5
order No:6
Item is delivered with order No.- 1
Item is delivered with order No.- 2
Item is delivered with order No.- 3
Item is delivered with order No.- 4
Item is delivered with order No.- 5
Item is delivered with order No.- 6

しかし、私は次のような出力を得ています:

order No:1
Item is delivered with order No.- 1
order No:2
Item is delivered with order No.- 2
order No:3
Item is delivered with order No.- 3
order No:4
Item is delivered with order No.- 4
order No:5
Item is delivered with order No.- 5
order No:6
Item is delivered with order No.- 6

シングル スレッドと非同期コールバックの概念のどこかが間違っています。コードがどのように機能するかを誰かに説明してください。

4

3 に答える 3

2

交換:

setTimeout(deliver(orderNo),5000);
}

と:

setTimeout(function() {
    deliver(orderNo); 
}, 5000);

関数の最初のパラメーターはsetTimeout関数ポインターです。あなたのコードでは、単なるパラメータであるdeliver(orderNo)呼び出しの結果を渡していました。これで、関数内voidを取り除くことができます。console.logplaceOrder

于 2015-11-29T14:13:27.030 に答える
2

間違ったsetTimeout署名定義を使用しています

var timeoutID = window.setTimeout(func, [delay, param1, param2, ...]);
var timeoutID = window.setTimeout(code, [delay]);

したがって、コードは次のようになります。

setTimeout(function() {
  deliver(orderNo);
}, 5000);
于 2015-11-29T14:19:25.033 に答える
0

tl;dr

これは構文の問題です。に間違った引数の型を渡していますsetTimeout

これを変える:

setTimeout(deliver(orderNo),5000);

これに:

setTimeout(deliver, 5000, orderNo);

この構文は IE 9 以下では機能しないことに注意してください。

説明

MDN の setTimeoutのドキュメントを見ると、最初の引数がFunctionまたはStringJavaScript コードで構成されていることがわかります。あなたの場合、この構文を受け入れる関数を渡そうとしています:

setTimeout(func, [delay, param1, param2, ...]);

param1, param2, ...関数の引数はどこにありますかfunc。あなたがしているのは、関数自体ではなく、関数によって返された値を渡すことです。

値を渡しているsetTimeoutため、期待どおりに実行されません。まだ出力を取得している理由deliverは、実際には ではなく実行時に実行されているためsetTimeoutです。自分で呼び出すのとほぼ同じですdeliver

引数としての関数

関数はJavaScriptの First-Class Citizensであることに注意してください。つまり、関数に引数として渡すことができます。

ボーナス

使用できる代替構文がいくつかあります。

コメントで述べたようpokeybitに:

setTimeout("deliver("+orderNo+");",5000);

これにより、関数とそのパラメーターを一度に使用できます。ただし、これは文字列連結のため、より醜い構文です。

匿名関数

無名関数で setTimeout を使用します。

setTimeout(function() {
  console.log("Item is delivered with Order No.- " + orderNo);
}, 5000);

これは間違いなく最も一般的で安全な構文です。

無名関数を返す関数

あなたは保つことができます:

setTimeout(deliver(orderNo),5000);

deliverを返す関数として定義する場合Function:

function deliver(orderNo) {
  return function() {
    console.log("Item is delivered with Order No.- " + orderNo);
  }
}

この値は関数を返すため、 の適切な型ですsetTimeout

于 2015-11-29T14:59:36.407 に答える