2017-10-15 7 views
0

ブール値を返すJavascript関数を作成しました。関数内のコード行の1つがREST呼び出しを呼び出します。私はそれをコーディングするときにコールが非同期になることに気付かなかった。非同期呼び出しを持つJavascript関数を正しく使用するにはどうすればよいですか?

if(isDataValid()) ... 

私は成功関数に呼び出し関数でアクションを移動することもできますが、私は、再利用可能なメソッドを作成しようとしていた。だから、基本的には、この方法は、常に私のような何かをするとき、「false」に戻ります。私はjQueryとエベレストを使用しています。私はまだ約束について何も学んでいないし、私はかなりコールバックプログラミングに新しいです。

function isDataValid(){ 

    // Read data from Local Storage 

    // Create object from data 

    // Flag variable to capture result 
    var isValid = null; 

    restClient 
     .read('/my/url', model) 
     .done(function(response) 
      {  
       // 'Good' response, set flag to true 
       isValid = true; 
      }) 
     .fail(function(response) 
      { 
       // 'Bad' response, set flag to false 
       isValid = false; 
      }); 

    return isValid; 
} 

がどのように非同期呼び出しを行い、真/ falseを返す必要があります。ここでは

は私のメソッドのバージョンを煮詰めていますか?

+0

あなたは単純にできません。スタックの一部が非同期である場合は、すべてが非同期で(コールバックまたは約束によって)書き込まれる必要があります。関数を呼び出すことはできず、同期的に応答を得ることができます。 –

+0

"再利用可能なメソッド"を作成し、それをパラメータとして 'invalid'を渡すsuccess関数から呼び出します。 – jdigital

答えて

1

awaitを内部で使用するには、機能にasyncとマークする必要があります。

あなたがレスポンスを使用しなかったため、私はそれを削除しました。 あなたが

var response = await restClient.read('/my/url/', model); 

応答を、必要な場合は、エラーを処理するために/キャッチを試みる使用する必要があります。あなたはまた、関数呼び出しの前にawaitを使用する必要がありますisDataValidを呼び出すための最後に

async function isDataValid(){ 

    var isValid = null; 

    try { 
     await restClient.read('/my/url', model); 
     isValid = true; 
    } catch(err) { 
     isValid = false; 
    } 

    return isValid; 
} 

:ここ は、最終的な結果です。だから、そのように見えます:

if(await isDataValid()) { ... } 

awaitのみasync機能、isDataValidasyncとしてマークされなければならないと呼ばれている関数の内部で使用することができますので。このようにして、awaitで使用するすべての関数呼び出しチェーンを更新する必要があります。

+0

これは関数を 'if(isDataValid())'として呼び出すのには役に立たない。 –

+0

@Felixあなたは正しいですが、 'if(await isDataValid())'に変更すると問題が解決されます –

+0

文が 'async'関数内にある場合のみです。私が言っているのは、あなたの提案は解決策の一部にすぎないということです。たぶん、あなたの答えを編集し、他の部分(関数を呼び出す方法)を含めることができます。 –

関連する問題