2016-07-02 9 views
3

私はhttps://nodejs.org/api/process.html#process_process_nexttick_callback_argを勉強していますが、私はある時点で固執しています。私はそれを以下に引用しています:APIは%100の同期または%100の非同期の例でなければなりません

APIは100%同期または100% 非同期のいずれかにすることが非常に重要です。次のような場合にはので

// WARNING! DO NOT USE! BAD UNSAFE HAZARD!  
function maybeSync(arg, cb) {  
    if (arg) {  
     cb();  
     return;  
    } 

    fs.stat('file', cb); 

このAPIは危険です:

maybeSync(true,() => {  
    foo();  
});  
bar(); 

foo()およびbar()があるかどうかは明らかではない。この例を考えてみましょう最初に呼ばれる。

foo()またはbar()が最初に呼び出されるかどうかはわかりません。 argは真であり、maybeSync関数は同期的に働くからです。したがって、すべてが同期して動作し、foo()はbar()の前に呼び出されます。これはなぜこの場合に当てはまりませんか?

次のアプローチは、はるかに優れています:fs.stat()は非同期であるとbar()は常にfoo()前に実行されることを意味し、次のティックで最も早いで実行されるため

function definitelyAsync(arg, cb) {  
    if (arg) {  
     process.nextTick(cb);  
     return; 
    } 

    fs.stat('file', cb);  
} 
+2

'maybeSync()'関数の内部を見ない限り、 'foo()'か 'bar()'が最初に呼び出されるかどうかは分かりません。*そして、あなたが渡す値が常に*ある種のものであることを保証できない限り、実行時に起こります。関数がどのように実装されているかを見ることなく、常に同期しているか常に非同期である特定の関数に頼ることができます。 – nnnnnn

+0

@nnnnnn、OK私はそれを得た。もう1つ質問してください、maybeSync()関数の2番目のパラメータには何か()=> {...}? Googleで検索することはできません:S – metis

+1

矢印機能と呼ばれ、新しいES6(EcmaScript 6)の一部です。 '()=> {...}'は 'function(){...}'と略同義ですが、スコープにもいくつかの違いがあることに注意してください。 –

答えて

1

実行は明らかではありません。

しかしながら、cb()が直ちに実行されるif (arg)句を導入し、次いでfoo()bar()前に実行される - これが同期しています。 したがって、実行前にargが何であるかを知らなければ、maybeSync()は予測可能性がありません。

definitelyAsync()力に関係なく常にarg値のfoo()前に実行されてbar()になりますif (arg)ブランチ内部cb()への呼び出しを、スケジューリングによって常に非同期実行、。

関連する問題