Javascript - 承诺和forEach

时间:2016-03-24 14:31:11

标签: javascript promise sails.js

我正在尝试用解析的xmls中的avatarIcon节点填充数组,但我在res.view中的最后一个数组是空的,执行似乎没有达到返回res.view函数。我该如何正确地做到这一点?

function parseXML(xml) {
 var parsed
 parseString(xml, { explicitArray: false }, function(err, result) {
     parsed = result
 })
 return parsed
}

function findUsers() {
 return new Promise(function(resolve, reject) {
    User.find().exec(function(err, sids) {
        resolve(sids)
    })
 })
}

avatars: function(req, res) {
    var arr = []
    findUsers().then(function(result) {
        result.forEach(function(el) {
            getProfileXML(el.sid).then(function(result) {
                 arr.push(parseXML(result).profile.avatarIcon)
            })

        })
        return res.view('users', {
            users: arr
        })

    })

}

1 个答案:

答案 0 :(得分:4)

您可以使用Promise.all来包装一组承诺。这里是未经测试的代码来演示使用,表达式的结果也是一个承诺:

return findUsers().then(function(result) {

  var promises = result.map(function(el) {
    return getProfileXML(el.sid);
  });
  return Promise.all(promises);

}).then(function(values) {
  var arr = values.map(function(v) {
    return parseXML(v).profile.avatarIcon;
  });
  return res.view('users', {
    users: arr
  })
})