2016-12-02 34 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); 
     } 
    }); 

問題:

有一些情況下newSurvey.saveincrementTotal運行之前可以完成處理。我該如何解決這個問題?

+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

謝謝你的答案。我會試試這個,讓你知道。只是有一個問題,在處理需要在異步環境中運行一系列事件的情況時,是否應該總是使用回調函數或類似async的庫?我試圖讓我的概念清楚。 – Skywalker

+0

建議使用異步庫,因爲它簡化了您的代碼。想象一下,你有更多的函數可以調用,使用回調函數你將構造死亡可怕的金字塔,與此同時'async.waterfall'你只是在數組中添加另一個元素。 –

相關問題