2017-10-23 15 views
1

ノードは、2つのフレーバー、同期、および非同期で多くのコア機能を提供します。カスタムノード同期機能

fs.readFileSyncのような同期機能は、npmパッケージのdotenvなど、アプリ起動時に非常に役立ちます。

asyncawaitというキーワードを必要としないカスタム同期関数を作成して、約束とコールバック地獄を迂回することはできますか?

+2

* "しかし、クラス構造や、より典型的なserver.jsアプリケーションの開始点では使用できません" *どちらの場合でも可能です。 –

+0

不正なステートメントが削除されました。 – John

+0

'非同期を必要とせず、約束とコールバック地獄を迂回するカスタム同期関数を書くことは可能ですか?'それは意味をなさない、コールバック地獄を持たないか、 async'/'await'、それがその全体のポイントです。 – Keith

答えて

1

約束とコールバック地獄を回避して、非同期と待機のキーワードを必要としないカスタム同期関数を記述することは可能ですか?

はい。その関数に呼び出すAPI関数のSyncバージョンのみを使用するようにしてください。

にはがあり、非同期API関数またはモジュールを使用する場合は、いいえ、自分のSyncバージョンを(簡単に)作成することはできません。 非同期作業を行い、それを同期的に待機する別の子プロセスを起動することができます(execSyncspawnSync)(具体的なことは思い出しませんが、少なくとも1つのnpmモジュールがありますその理由...)


...しかし、彼らはクラスの構造やアプリの開始点より典型的なserver.jsに使用することはできません...

はい彼らができます、 両方の場合において。ここでは例です:

function somethingAsync() { 
 
    return new Promise(resolve => { 
 
    setTimeout(resolve, 400, Math.floor(Math.random() * 10)); 
 
    }); 
 
} 
 

 
// Using async/await in a class: 
 
class Example { 
 
    async doSomething() { 
 
    let a = await somethingAsync(); 
 
    return a * 2; 
 
    } 
 
} 
 

 
// Using async/await in a top-level script: 
 
(async() => { 
 
    try { 
 
    const ex = new Example(); 
 
    console.log("Waiting..."); 
 
    const v = await ex.doSomething(); 
 
    console.log(v); 
 
    } catch (e) { 
 
    console.error("Error: ", e); 
 
    } 
 
})();
それが未処理の拒絶反応を避けるために、その非同期機能の体の周り try/ catchを使用(またはその戻り値に .catchを使用)することが重要だと

注意関数の約束(関数asyncが約束を返すことを覚えておいてください)が拒否された場合はエラーとなります。

+0

ああ、それは理にかなっています。何らかの読書をしなければならないでしょう。これが 'readFileSync'がどのようにして動作しているのか知っていますか? – John

+0

それは用語かもしれませんが、 'doSomething'メソッド呼び出しではなく、クラス構造ではありません。 IOW;関数のコンストラクタは約束を返しませんが、メソッド呼び出しは私がとにかく使用するものです。 – Keith

+0

@ John:「this」とは、「API呼び出しのバージョンを同期するだけです」と答えた場合、答えは主に「はい」です。たとえば、 'readFileSync' [here](https://github.com/nodejs/node/blob/master/lib/fs.js)を見つけることができます。これは、単に 'openSync'、' readSync'などを使用します。プラットフォーム上で利用可能なsync(非同期ではなく)I/O呼び出しを使用して、最低レベルの操作のいくつかはNodeの基礎となるC++コードで同期して実装されます。 –