0

awaitを使用してasync機能以外のコードを停止できますか?しかし、私はすべてのコードを止めたくありません。私は実行するコードを制御したい。私は、このような何か解決策があるかもしれないと思うAsync/Awaitで停止するコードを制御します。

var isAsyncRunning = false; 
var currentPromise; 
async function asyncFunc(){ 
    isAsyncRunning = true; 
    //Do some code here 
    currentPromise = promise; //promise was defined inside the code 
    await promise; 
    promise.then(function(){ 
     isAsyncRunning = false; 
    }); 
} 
async function anotherFunction(){ 
    if(!isAsyncRunning){ 
     await currentPromise; 
    } 
    //Do some other code here 
} 

はしかし、私は多くの機能を持っており、に私が持っているすべての単一の機能これを適用しません。

もっと良い解決策はありますか?そうでない場合は、これを時間を節約するために私ができることはありますか?

+0

この機能を1つの機能に適用すると何が達成されますか?背景や例が役立つかもしれません。 – jib

+0

すべての単一機能ではありません。私は*停止するものを制御*するように言いました。すべての機能には適用されません。 – MasterBob

+1

'async'に設定されていない関数の中で' await'を使うことはできません - したがって 'anotherFunction'は無効です –

答えて

2

約束およびasync/awaitのご理解は正しくないと思います。関数asyncを作成するときは、約束の前にawaitキーワードを使用して、約束が満たされるか拒否されるまでコードの実行が一時停止するようにしてください。あなたのコードを簡略化することができます。

var currentPromise; 

async function asyncFunc(promise){ 
    // Do some code here 
    return await promise; 
} 

function anotherFunction(){ 
    asyncFunc(currentPromise); 
} 

我々はreturn await promiseを呼び出している約束が果たさまたは拒否し、それがanotherFunction機能への出力を返すまで、実行エンジンは、ノンブロッキングな方法で待機します。

注:あなたはバニラJavaScriptを好む場合は、bluebirdまたはこのmethodreduce機能を使用することができます順番に約束を実行したい場合。

は、元の質問に、あなたの最新のコメントからコード実行

を一時停止、私はあなたのプログラムの実行を一時停止することを理解しています。まず、は、Javascriptの実行をブロックする方法を停止することはできないことを理解する必要があります。 Javascriptは、イベントループを使用して同時実行を処理するシングルスレッドプログラミング言語です。操作のためにエンジン全体を停止することは決してありません。それ以外の場合、プログラムはフリーズします。スレッドベースのプログラミング言語では、プログラマはスレッドを使用して同時実行を実装します。

ただし、JavaScriptはノンブロッキングの方法で実行を一時停止することができます。async/awaitを使用してください。例:

私が正しく理解している場合は、ユーザーの入力に基づいて実行を一時停止したいと考えています。任意のタイプのロジックを実装することができます。 keyCodeが押されるまで、この例では

function waitForUserInput(keyCode) { 
    return new Promise(resolve => 
    document.addEventListener('keydown', (event) => { 
     if (event.keyCode === keyCode) resolve() 
    } 
) 
} 

async function main() { 
    await waitForUserInput(13) 
    console.log('Thank you for your submission!') 
} 

main() 

が、約束が解決されないだろう、と何もコンソールに記録されません。たとえば、次のプログラムは RETURNキーを押して、ユーザを待ちます。 waitForUserInputはJavascriptエンジンを停止しません。エンジンは他のコードを実行し続け、UIイベントに応答します。

+0

私はそれがどのように機能するか知っていますが、私は最後の行を見ています。 「エンジンは他のコードを実行し続け、UIイベントに応答します。」私はこのコードが実行されているか、コードが実行されているのか、何が制御されているのかを知りたい。 – MasterBob

+0

@ MasterBobこれは* await *で行うことができますが、Javascriptエンジンを完全に一時停止することはできません。それは不可能です!しばらく時間をかけてこの記事を読んでください:https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoopまた、この回答を見てください:http://stackoverflow.com/a/2734311/177006 – bman

+0

私はそれが不可能だと思う、私は私のソリューションを使用する必要があります。これは、私が心配しているのは、async'/'await'をサポートしていないブラウザでは通常の関数でさえ機能しないからです。 – MasterBob

関連する問題