2016-12-02 4 views
0

私が知る限り、Mongooses schema.save()メソッドは非同期です。 schema.save()メソッドの前に外部関数を実行することが可能ですか?schema.save()は、外部関数の処理が完了するまで呼び出されません。schema.saveメソッドの前に外部関数を実行

//External function 
incrementTotal(req,res); 

    newSurvey.save(function (err, data) { 
     if(err) { 
      sendJsonResponse(res, 400, err) 
     } else{ 
      console.log("3") 
      sendJsonResponse(res, 200, data); 
     } 
    }); 

問題:

incrementTotalnewSurvey.save実行が処理を終えることができる特定の状況があります。この問題を解決するにはどうすればよいですか?

+0

コールバックを使用してください: – xShirase

答えて

0

あなたはincrementTotalコールバックの中に物事を保存することができます。 Promisesなどのライブラリは、この種の問題に役立ちます。

incrementTotal(req,function(err,res){ 
    if(!err){ 
    newSurvey.save(function (err, data) { 
     if(err) { 
      sendJsonResponse(res, 400, err) 
     } else{ 
     console.log("3") 
     sendJsonResponse(res, 200, data); 
     } 
    }); 
    }else{ 
    console.log(err); 
    } 
}); 
0

あなたがasyncライブラリを使用している場合は、waterfallを利用することができます。これは一連の関数が配列で実行され、それぞれがその結果を配列の次のものに渡します。いずれかのタスクがコールバックにエラーを渡すと、次の関数は実行されず、メインのコールバックがエラーとともにただちに呼び出されます。

async.waterfall([ 
    incrementTotal, 
    mySaveFunction, 
], 
function (err, result) { 
    if (err) { 
    sendJsonResponse(res, 400, err) 
    } else { 
    console.log("3") 
    sendJsonResponse(res, 200, data); 
    } 
}); 

function incrementTotal(callback) { 
    callback(null, data); 
} 

function mySaveFunction(data, callback) { 
    // 'data' is the result of incrementTotal 
    // so this should be newSurvey.save 
    callback(null, data); 
} 
+0

答えをありがとう。私はこれを試して、あなたに知らせるでしょう。ただし、非同期環境で一連のイベントを実行する必要がある状況を処理する場合は、常にコールバックまたは非同期のようなライブラリを使用する必要がありますか?私のコンセプトを明確にしようとしています。 – Skywalker

+0

非同期ライブラリを使用すると、コードが簡単になるのでお勧めします。 callbackを使って呼び出す関数がたくさんあるとしたら、恐怖のピラミッドを構築しますが、async.waterfallでは配列に別の要素を追加するだけです。 –

関連する問題