2017-12-30 68 views
1

React Nativeプロジェクトでは、Promiseを使用してこの機能を書いて、非同期でジョブを実行しました。React NativeでPromisesを使用して非同期でジョブを実行する方法はありますか?

function doEncryptionAsync(params) { 
    return new Promise(
    function (resolve, reject) { 
     // Async code started 
     console.log('Promise started (Async code started)'); 

     // The job that takes some times to process 
     var encrypted_value = new EncryptedValue(params); 

     if (true) { 
     resolveencrypted_value 
     } 
     else { 
     reject("Error while encrypting!"); 
     } 
    } 
) 
} 

私はそれを私のReduxアクションで呼び出します。

export const encrypt = (params) => { 
    return (dispatch) => { 
    dispatch({ 
     type: type.ENCRYPT 
    }); 

    // Sync code started 
    console.log('Started (Sync code started)'); 

    doEncryptionAsync(params) 
     .then((response) => { 
      // Async code terminated 
      console.log('Promise fulfilled (Async code terminated)'); 

      encryptSuccess(dispatch, response); 
     }) 
     .catch((error) => { 
      console.log(error); 

      encryptFail(dispatch); 
     }); 

    // Sync code terminated 
    console.log('Promise made (Sync code terminated)'); 
    } 
} 

動作はしますが、非同期ではありません。私のメインスレッドは、doEncryptionAsync()が返されるまでブロックされているようです。行console.log('Promise made (Sync code terminated)')が実行されますが、すぐには実行されません!

ログの出力は次のとおりです。

// OUTPUT Simulation 
Started (Sync code started)     at time x 
Promise started (Async code started)  at time x 
Promise made (Sync code terminated)   at time (x + 2sec) 
Promise fulfilled (Async code terminated) at time (x + 2sec) 

AsyncTaskを実装する私のアプローチは何ですか?

答えて

1

JavaScriptの非同期動作は、IOブロック機能にのみ関連しています。つまり、IO関数を待つ代わりに、イベントループが実行され続けます。

JSがシングルスレッドであると見ると、CPU境界の計算はスレッドを占有し、非同期には実行できません。

あなたの唯一の手段は、native moduleを作成して、別のスレッドで計算を行い、完了したらJSコールバックを呼び出すことです。

+0

私は残念ながらそれを知らなかった! – YUSMLE

+0

あなたは 'ネイティブモジュール'ソリューションを作成します。私たちの暗号化ジョブは、JavaScriptライブラリをベースにしています。結局のところ、それがReact Nativeを使用している理由です! – YUSMLE

+0

私はあなたがどこから来ているのかを完全に把握していますが、プラットフォームの仕組みとちょうど関係があります。それは銀色の弾丸ではない。 – Kraylog

関連する問題