2016-08-01 67 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 
    } 
}); 

问题是结果对所述第一简档的型材阵列。 像

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

但我期待的数组profiles不同。

我错过了什么?

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