2017-05-10 13 views
0

私は長い実行関数A()を持っています。私の関数B(){}はいつでも呼び出すことができます。Javascriptキューに別の関数が完了した後にキューに入れます

Note関数Bは、Aの後に呼び出される必要はありません。ただし、呼び出された場合、Aが実行されている場合は、Aを終了する必要があります。そして、私はpromise.then()について考えB.

を実行しますが、それはこのような状況ではあまり有用ではありませんのでBは必ずしもA.後に呼び出されないことがあります。

論理を保証するためにBをキューに入れる方法はありますか?

+0

あなたはAが終了する前にBが実行を開始することを考えさせる何?あなたの環境は何ですか?あなたは次のようなものを読んでみたいです:http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded –

+0

はAとBの同期または非同期ですか?両者が同期している場合、何もする必要はありません.Aは終了するまでBの実行を停止します。 –

+0

AとBの両方が非同期です。 –

答えて

1

フラグを使用しないでください!それらは完全に不要です。

はまたA()またはB()に特別なことをしません。あなたが通常任務を実行するのと同じように書くだけです。

動的に更新されるプロミスチェーンの形式でキューを実装するだけです。次のように

var q_ = Promise.resolve(); 

function queue(fn) { 
    q_ = q_.then(fn); 
    return q_; 
} 

今、あなたは、AB、または他の関数をキューに入れることができます。

queue(A); 
queue(B); 
queue(someOtherFunction); 

それとも、あなたはパラメータ渡す必要がある場合:ボーナスとして

queue(A.bind(null, 'a', 'b', 'c')); 
queue(B.bind(null, 'x', 'y', 'z')); 
queue(someOtherFunction.bind(null, 1, 2, 3)); 

を、

  • A()B()(およびその他の関数)は、そのまま(unqueued)呼び出すことができます。
  • queue()に渡される関数が同期型であるか非同期型であるかを心配する必要はありません。いずれかと一緒に動作します。

DEMO

1

このような何か: 変数var inQueue = 0を定義します。 Aが起動すると、変数inQueue = 1を設定し、終了するとinQueue = 0に設定します。今、これはBがAが実行されているとAの終わりにfalseに設定されている場合A.

1

trueある変数を使用して中断しませんようになります

if(!inQueue) B(); 

のようにチェックを入れます。 B以内にチェックしてください。実行中の場合は、1秒待ってからBに再度電話してください。

var isARunning 

A() { 
    isARunning = true 
    //do the things 
    isARunning = false 
} 

B() { 
    if (isARunning) { 
    setTimeout(() => { B() }, 1000); 
    } 
    else { 
    // do more things 
    } 
} 
関連する問題