JavaScript - Promises和forEach

3
我正在尝试从解析的XML中使用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个回答

4
你可以使用 Promise.all 包装一组 Promise。以下是未经测试的代码示例,演示了如何使用 Promise.all,其中表达式的结果也是一个 Promise:
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
  })
})

非常感谢,你救了我脱离这个麻烦。 - Fiat Pax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接