2017-11-14 1 views
-1

다음 함수는 여러 개의 사용자 ID 배열을 포함하는 집계 커서를 사용하므로 해당 ID를 가진 사용자를 수정 한 다음 저장할 수 있습니다.Nodejs와 Mongoose는 콜백 전에 문서가 저장 될 때까지 대기합니다.

내가 겪고있는 문제는 일단 모든 사용자가 수정되고 저장되면 함수가 돌아 오는 것입니다. 현재는 그렇게하지 않으며 나중에 (이 함수 다음에 나오는) 사용자에게 액세스하려고 시도하면 수정 사항이 완전히 스며 들지 않습니다.

이 수정을 수행하는 현재의 코드입니다 (내가 성공하지 다른 옵션의 10 초 시도 된 일부 이상한 비동기 추가 될 수 있음) :

function updateUsers(dataArray, done) { 


dataArray.eachAsync(
function(data) { 
    let userArray = data.users;  

    async.forEach(userArray, function(userId, callBack){  

    mongoose.model('User').findById(userId, function(err, user) { 
     // User document modified   
     user.save(function(err, user){ 
     callBack(); 
     });   
    }); 
    }); 
}, 
function(err) { 
    //Only come here once all the users have been modified and saved! 
    if (err) { 
    return done(err, false); 
    } 

    return done(err, true); 
    } 
); 
} 

전달되는 데이터는 다음과 같습니다

dataArray : eachAsync 예에 대한 집계 커서

결과 데이터는 다음과 같습니다 당신은 콜백의 매 반복 한 후 콜백을 통해 return 문을 호출

{ _id: 'GroupValue', 
users: 
[ 5a0b2f5bcd0813adeac2435b, 
    5a0b2f5bcd0813adeac24357, 
    5a0b2f5bcd0813adeac24358 ] } 

답변

0

. 따라서 userArray.length 번을 반환합니다.

데이터를 삽입하고 삽입하는 데 성공했는지 여부를 알기 위해 데이터를 사용하지 않으려면 루프를 반복하기 전에 바로 콜백을 수행하면됩니다.

function updateUsers(dataArray, done) { 


dataArray.eachAsync(
function(data) { 
    let userArray = data.users;  

    callBack(); 
    async.forEach(userArray, function(userId, callBack){  

    mongoose.model('User').findById(userId, function(err, user) { 
     // User document modified   
     user.save(function(err, user){ 
     //do nothing 
     });   
    }); 
    }); 
}, 
function(err) { 
    //Only come here once all the users have been modified and saved! 
    if (err) { 
    return done(err, false); 
    } 

    return done(err, true); 
    } 
); 
} 

그렇지 않은 경우의 당신 만 마지막 반복 한 후 특별히 콜백 할 가정 해 봅시다. 이렇게 할 수있는 더러운 방법 중 하나는 루프 외부의 임시 변수와 마지막 반복에서 실행되는 루프의 if 문입니다.

이 구현에서는 함수가 0이 아닌 길이의 사용자 배열을 전달하지 않는다고 가정해야합니다. 그렇지 않으면 단일 반복을 실행하지 않고 종료하지 않습니다. (if length == 0으로 쓰고 싶을 때)

function updateUsers(dataArray, done) { 


dataArray.eachAsync(
function(data) { 
    let userArray = data.users;  
    let tempVar = 0; 

    async.forEach(userArray, function(userId, callBack){  

    mongoose.model('User').findById(userId, function(err, user) { 
     // User document modified   
     user.save(function(err, user){ 
     tempVar++; 
     if(tempVar == userArray.length) { 
      callBack(); 
     } 
     });   
    }); 
    }); 
}, 
function(err) { 
    //Only come here once all the users have been modified and saved! 
    if (err) { 
    return done(err, false); 
    } 

    return done(err, true); 
    } 
); 
} 
}, 
function(err) { 
    //Only come here once all the users have been modified and saved! 
    if (err) { 
    return done(err, false); 
    } 

    return done(err, true); 
    } 
); 
} 
관련 문제