2016-08-01 4 views
0

이 NodeJS 코드의 문제점은 무엇입니까?nodejs 비동기 제어 흐름 (루프 포함)

다음 NodeJS snipt가 있습니다.

Profile.findOne(profileId, cb) //is sync function 


function getProfiles(users, cb) { 
    var results = []; 
    var n = users.length; 
    users.forEach(function(user, i) { 
    Profile.findOne(user.profileId, function(err, prf) { 
     if (err) { 
     return cb(err, null); 
     } 
     console.log(prf); 
     console.log(user.profileId); 
     results.push(prf); 
     if (i + 1 == n) { 
     console.log('looping done'); 
     return cb(null, results); 
     } 
    }); 
    }); 
} 

// some where 
var userslist = [{ 
    name: 'ab', 
    profileId: 'daf242' 
}, { 
    name: 'cd', 
    profileId: 'hg535h' 
}, { 
    name: 'ef', 
    profileId: 'cvxv445' 
}]; 
getProfiles(userslist, function(err, data) { 
    if (err) { 
    //do this 
    } else { 
    //do that 
    } 
}); 

문제 결과가 제 profileID가위한 프로필 배열되어있다.

[ {username:'ab',avatarUrl:'abcd.png'} {username:'ab',avatarUrl:'abcd.png'}, {username:'ab',avatarUrl:'abcd.png'} ] 

좋아하지만 난 전혀 다른 프로파일의 배열을 기대하고있다.

무엇이 누락 되었습니까?

+0

이 시도 약속 : https://jsfiddle.net/rayon_1990/Ldd0mcrj/ – Rayon

답변

1

여기서 동기 및 비동기 코드를 혼합합니다. forEach 루프는 동 기적으로 실행되지만 Profile.findOne 메소드는 비동기입니다. 그런 다음 초기 함수로 전달 된 콜백을 호출합니다. async for an asynchronous for loop을 사용하여보아야합니다.

그러나 Node.js의 비동기 성격을 아직 완전히 파악하지 못한 것이 많은 질문이 있습니다. 주제 (예 : callback hell)를 읽으십시오.

+0

당신은 _ "초기 함수에 전달 된 콜백을 호출"정교한 _를? – Rayon

+0

@MrWillihog는 문제를 해결할 수있는 방법을 제안 할 수 있습니까? 링크를 읽고 주제를 밝게 만듭니다. 하지만 지금은 일종의 qucik suggetion/fix이 필요합니다. – Zstudent

+0

@Rayon -'getProfiles' 함수는 콜백 ('cb')를 전달합니다. 이것은'Profile.findOne' 메소드 내에서 호출됩니다. 결과적으로 발견 된 첫 번째 프로파일은 결과를'getProfiles' 함수의 콜백에 전달합니다. – MrWillihog

0

사용 async 또는

var async = require('async'); 
... 
async.map(users, Profile.findOne, function(err, results) { 
    if (err) 
     return ...// process errors; 

    userlist = results; 
})