2016-05-17 17 views
1

関数f1とf2が終了した後で関数cbを呼び出すようにしたい(f1とf2は非同期であり、 。他の非同期関数が実行された後に関数を呼び出す

私はこのようなものを実装しようとしていますが、node.jsでこれを行うのが最善の方法ではないようです。

var l1 = false; 
var l2 = false; 

// function to be called after f1 and f2 have ended 
function cb(err, res) { 
    if (err) { 
    console.log(err); 
    } else { 
    console.log('result = ' + res); 
    } 
} 

// f1 and f2 are practically identicals... 
function f1(callback) { 
    console.log('f1 called'); 
    l1 = true; 
    if (l2) { 
    console.log('f1 calling cb'); 
    callback(null, 'one'); 
    } else { 
    console.log('f2 wasn\'t called yet'); 
    } 
} 

function f2(callback) { 
    console.log('f2 called'); 
    l2 = true; 
    if (l1) { 
    console.log('f2 calling cb'); 
    callback(null, 'two'); 
    } else { 
    console.log('f1 wasn\'t called yet'); 
    } 
} 

setTimeout(function() { 
    f1(cb); // will call cb 
}, 3000); 
setTimeout(function() { 
    f2(cb); // won't call cb 
}, 1000); 

// It will print: 
// f2 called 
// f1 wasn't called yet 
// f1 called 
// f1 calling cb 
// result = one 
+2

これを達成するための約束を使用してください。 – Akhoy

+1

外部ライブラリを使用しますか?このようなシナリオや[async](https://github.com/caolan/async)という他の多くのシナリオで一般的なものがあります。あなたが喜んでいると言うなら、私はこの特定のシナリオにそれを適用する方法を説明する答えを書くでしょう。 –

+0

はい、確かに、私は外部ライブラリを使用したソリューションを探していました。私は非同期モジュールを調べましたが、役に立たないものは見つかりませんでした。 – orangesky

答えて

3
var async = require('async'); 

console.log('before invocation'); 

async.parallel([ 
    function f1(cb) { 
    console.log('f1 invoked'); 

    setTimeout(function() { 
     console.log('f1 calling back'); 
     cb(null, 'one'); 
    }, 3000); 
    }, 
    function f2(cb) { 
    console.log('f2 invoked'); 

    setTimeout(function() { 
     console.log('f2 calling back'); 
     cb(null, 'two'); 
    }, 1000); 
    } 
], function callback(err, results) { 
    console.log('callback invoked'); 

    if (err) { 
    console.log(err); 
    } else { 
    console.log('results: ', results); 
    } 
}); 

console.log('after invocation'); 

setTimeout(function() { 
    console.log('2 seconds later...'); 
}, 2000); 

出力:

before invocation 
f1 invoked 
f2 invoked 
after invocation 
f2 calling back 
2 seconds later... 
f1 calling back 
callback invoked 
results: [ 'one', 'two' ] 

言い訳私は完全にあなたのシナリオを複製しませんでしたが、私はあなたがモックアップとにかくだった持っていたものことを認めていたという事実。

唯一の違いは、最終コールバックには並列に実行される各関数の結果の配列が含まれ、setTimeout()は各関数内で呼び出される点です。

返される配列は、async.parallel()に渡される関数の順序であるため、['one', 'two']であることに注意してください。各関数に提供される引数cbは、asyncによって生成されます。これは自動的にエラー処理やその他のバックグラウンド処理を行います。これは、2つのフラグの使い方と似ていますが、

+0

この解決策には問題がありますasync.parallel()が呼び出されたときにf1とf2の両方の関数が呼び出されます。私は実際にf1またはf2がいつ呼び出されるかについての情報を持っていません(彼らは独立しています)。 2分後にf1を今呼び出すことができ、f2を呼び出すことができます。 setTimeoutは単なる例で、代わりにこのようなものが必要です。 handler.on( 'some_event'、f1); handler.on( 'other_event'、f2); ご協力いただきありがとうございます! – orangesky

+0

@orangeskyあなたが 'f1'と' f2'を呼び出すことについて詳しく述べることができ、またこれらの2つの関数が(最終コールバックのフラグを扱う以外の)何をするべきかについて、私はあなたに良い答えを与えることができます。しかし、その情報がなければ、私が扱っていることを正確に伝えるのは難しいです。 –

関連する問題