2015-06-17 4 views
1

Я создаю набор объектов для сохранения в mongoDB из потока csv. Для каждой строки csv мне нужно проверить перед сохранением, что объект или объекты не существует в MongoDB. Следующий код выполняется внутри маршрута GET.проблема с асинхронным водопадом при запросе DB

Я пытаюсь использовать асинхронный водопад, но он не ведет себя так, как я ожидал.

Вот код

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"); 
    }) 

Я бы ожидать, что это вернет следующий

в FUNCTION1

объекта док в формате JSON

в function2

законченный !

вместо этого я получить

в функции 1

в function2

закончил!

нуль

он работает, как и ожидалось, пока нет 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

Вашей 2-й функции является неправильной. Должна быть функция (doc, callback), NOT function (callback, doc) – Ben

 Смежные вопросы

  • Нет связанных вопросов^_^