2015-06-17 82 views
1

我構建了一組要從csv流保存在mongoDB中的對象。對於每一個csv行,我需要在保存之前驗證一個或多個對象在MongoDB中不存在。下面的代碼在GET路徑中運行。查詢數據庫時出現異步瀑布問題

我一直在嘗試使用異步瀑布,但它並不像我預期的那樣工作。

下面是代碼

async.waterfall([ 
     function (callback) { 

      console.log('in function 1'); 
     --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
       console.log(JSON.stringify(doc)) 
      }) 
      callback(null); 

     }, 
     function (callback) { 

      console.log('in function2') 
      callback(null) 
     }], 

    function(err, results) { 
     console.log('finished!') 
     res.send("complete"); 
    }) 

我希望它可以在功能1

doc對象返回以下

在JSON

在函數2

成品!

,而不是我得到

在功能1

在函數2

完蛋了!

它運行正常,只要沒有findOne()調用。 我在想什麼?

非常感謝

回答

1

findOne是一個異步函數。您需要將此函數內的回調移至您期望的順序。

async.waterfall([ 
    function(callback) { 
     console.log('in function 1'); 
     Diagnosis.findOne({name: diagnosisName}, function(doc) { 
     console.log(JSON.stringify(doc)); 
     callback(null); 
     }); 

    }, 
    function(callback) { 

     console.log('in function2'); 
     callback(null); 
    } 
    ], 

    function(err, results) { 
    console.log('finished!'); 
    res.send("complete"); 
    } 
); 

但爲什麼不使用內部承諾(或其他承諾lib)?

console.log('in function 1'); 
// exec creates a new promise 
Diagnosis.findOne({name: diagnosisName}).exec(function(doc) { 
    console.log(JSON.stringify(doc)); 
    // resolve this with doc 
    return doc; 
}).then(function(doc) { 
    console.log('in function2'); 
    // resolve this with doc 
    return doc; 
}).then(results) { 
    // results here is just doc from the previous resolution 
    console.log('finished!'); 
    res.send("complete"); 
}); 
0

在你的第一個功能:

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
      console.log(JSON.stringify(doc)) 
     }) 
     callback(null); 

    }, 

您的回調調用findOne這是異步後調用。只要findOne完成,您就應該使用您的回調。 這意味着:

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, function (doc){ 
      console.log(JSON.stringify(doc)) 
      callback(null); 
     }) 


    }, 

甚至更​​好

function (callback) { 

     console.log('in function 1'); 
    --> Diagnosis.findOne({name: diagnosisName}, callback); 


    }, 
    function (callback, doc) { 
     console.log(JSON.stringify(doc)) 
     callback(null); 
    }, 
+0

你的第二個函數的簽名不正確。應該是函數(doc,callback),NOT函數(callback,doc) – Ben