2017-02-06 9 views
-1

は、次の三つの機能や変数JavaScriptの関数の実行順序

var someList = []; 

makeObject() { 

// loops through someList here to create an object 
// then calls sendObject function 

sendObject() 

} 

sendObject() { 
// sends object to database using HTTP call 
} 

resetList() { 
// resets the list to be empty 
// e.g. someList = [] 
} 

を持っていると言うそして、あなたがそう

makeObject() 
resetList() 

のようにそれらを呼び出す任意のpossiblityまたはリストが前にリセットされることをどのような状況がありますmakeObject関数にはループする機会がありますか?

+0

ループとは何ですか? 'for'ステートメント? –

+0

はいこれはforステートメントです。 – user2085143

+0

そうしないと、 'for'ループは' sendObject() 'が動作する前に必ず終了します。 –

答えて

2

JavaScriptでできることは、非同期でノンブロッキングです(XMLHttpRequestsetTimeoutが古典的な例です)。内部にmakeObjectのいずれかを使用すると、非同期部分が呼び出される前にresetListが実行されます。

+0

FromDataオブジェクトにデータを追加するのはどうですか? – user2085143

+0

それについて非同期なものはありません – Quentin

+0

最後の質問私はあなたを気にします。次のものをmakeObjectに渡していたらどうなりますか? var deferred = $ q.defer()。例えばmakeObject(遅延)? – user2085143

2

resetList()は、HTTP呼び出しが行われた直後に呼び出されます。あなたはHTTP呼び出しの前に、他の非同期作業を行う場合を除き、順序は常に次のようになります。

  • makeObject()
  • makeObject内部ループ()
  • sendObject()
  • )(makeObject内部から呼び出されましたsendObject()はHTTP呼び出しを行います
  • HTTP呼び出しがasyncであるため、resetList()はHTTP呼び出しの直後にトリガーされます。
  • HTTPリターンとそれに接続されているハンドラがトリガされます。

ただし、他の非同期作業を行わないように注意してください。それ以外の場合は適用されません。

+0

これははるかに良い答えです。彼は誰であるかを知っている。 –

+0

makeObjectに次のものを渡していたらどうなりますか? var deferred = $ q.defer()。例えばmakeObject(deferred)($ qはAngularの約束ライブラリです) – user2085143

+0

それはあなたが '' sendObject() ''への呼び出しがamdeなので、延期されたものと何をするかによって異なりますので、もっとコードを表示する必要がありますその状況について賢明なこと。しかし、あなたはたぶん別の '.then(fn)'をそれを遅延させて連鎖してほしいと頼んでいるので?その場合、 'sendObject()'への呼び出しが '.then()'のコールバックの中にあることを確認して、遅延解決の前にトリガされないようにする必要があります。 – Shilly