2017-12-22 10 views
1

私はいつもこれに利益があるかどうか疑問に思いました。以下に例を示します。約束に包まれ非同期関数が約束と同期の関数にラップされている

非同期機能:

(async() => { 
    await new Promise((resolve, reject) => { 
     fs.writeFile(filePath, dataToWrite, (error) => { 
      if (error) { 
       reject(error); 
       return; 
      } 
      resolve(); 
     }); 
    }); 
})(); 

同期機能:

(() => { 
    fs.writeFileSync(filePath, dataToWrite); 
})(); 

私は軽い読み物から知っている唯一のことは、同期関数呼び出しブロックプロセスが完了するまで、ということです。したがって、たとえば、APIエンドポイントを持つWebサーバーは、同期機能が完了するまでこれらの要求を処理できません。これは、約束事に包まれた非同期関数にも当てはまりますか?両者の間に相違がある場合には、それを説明することができますか?

+1

async関数自体が、非ブロックの約束を返します。 – mehulmpt

+1

あなたのサンプル内に何かを待っているコードがないことを考えれば、まったく違いはありません。また、なぜIIFEでそれを包むのですか? – Bergi

+0

私が間違っていない場合は、writeFileSyncがブロックされており、ディスク/ファイルシステムにファイルを書き込むのが完了するまで待つ必要があります。 – Veve

答えて

2

同期関数呼び出しは、完了するまでプロセスをブロックします。

はい。

これは、約束事で包まれた非同期関数にも当てはまりますか?

いいえ、それは非同期処理のポイントです。

awaitは、待望の約束が解決するまで、特定のコードasync functionのコードの実行を「ブロック」するだけですが、それ以外はすべて実行を継続します。

+0

を使用します。非同期関数をラップするのに有益です機能が実行されている間にアプリケーションの他の部分がブロックされないようにしたい場合、約束していますか? (ちょうど明確にしたい) –

+0

約束を守ることは良い習慣ですが、それが非阻止的な理由ではありません。これは、まず 'writeFileSync'の代わりに' writeFile'という非同期関数を使用することです。プロミスと 'async関数 'はコールバックを使うよりも簡単に結果を扱うことができます。 – Bergi

関連する問題