使用Nodejs中的Promises从循环返回数据

时间:2018-01-30 11:54:39

标签: javascript node.js

我有下面的链接循环序列,我想使用promises返回,但是在我的代码中执行forEach之前我得到了响应...任何人都可以告诉我哪里出错了...我想要使用本机Promises来做它并且不喜欢使用await / async,这样我就能更好地理解Promises的功能。

Details.find(function(err,details){
    if(err){
        res.send(err)
      }else{
          console.log("----------First Promise------------")
          return details
      }
}).then(result1 => {
    result1.forEach(function(item){
        renderData = {}
        OrgChart.findOne({GID:item.gid},function(err,detail){
                console.log("Detail is ------> " + detail.DISPLAY_NAME)
                if(err){
                    res.send(err)
                }else{
                    return detail.DISPLAY_NAME
                }
            }).then( result2 => {
                renderData.gid = result2.DISPLAY_NAME
                renderData.pageouttime = item.pageouttime
                renderData.createdAt = item.createdAt
                renderData.oncall = item.oncall
                renderData.comments = item.comments
                renderData.actionLink = item._id.toString()              
                console.log(renderData)
                dataArr.push(renderData)

            })      
    })
}).then(result3 => {
    console.log("Final Result is ----> " + result3)
    response.data = result3
    res.json(response) 
}) 

在forEach中,我想使用行的值获取值。我是节点js和Promises的新手...我想实现类似下面的东西但是使用Promises。

我希望通过Promises实现的示例序列

var someArray = []
var DetailsObj = Details.find()
DetailsObj.each(function(item){
   var newMap = {}
   newMap.prop1=item.prop1
   newMap.prop2 = item.prop2
   newMap.prop3 = OrgChart.find({id:item.prop3}).displayName
   someArray.push(newMap)
})

拜托,任何人都可以告诉我哪里出错了吗?

更新1(不工作)

return Promise.all(result1.map(function(item){
        renderData = {}
        OrgChart.findOne({GID:item.gid},function(err,detail){
                console.log("Detail is ------> " + detail.DISPLAY_NAME)
                if(err){
                    res.send(err)
                }else{
                    return detail.DISPLAY_NAME
                }
            }).then(result2 => {
                renderData.gid = result2.DISPLAY_NAME
                renderData.pageouttime = item.pageouttime
                renderData.createdAt = item.createdAt
                renderData.oncall = item.oncall
                renderData.comments = item.comments
                renderData.actionLink = item._id.toString()              
                console.log(renderData)
                dataArr.push(renderData)
            })      
    }))

我仍然得到一个空阵列

更新2(从地图回调中添加了返回---仍无法正常工作)

return Promise.all(result1.map(function(item){
        renderData = {}
        OrgChart.findOne({GID:item.gid},function(err,detail){
                console.log("Detail is ------> " + detail.DISPLAY_NAME)
                if(err){
                    res.send(err)
                }else{
                    return detail.DISPLAY_NAME
                }
            }).then(result2 => {
                renderData.gid = result2.DISPLAY_NAME
                renderData.pageouttime = item.pageouttime
                renderData.createdAt = item.createdAt
                renderData.oncall = item.oncall
                renderData.comments = item.comments
                renderData.actionLink = item._id.toString()              
                console.log(renderData)
                dataArr.push(renderData)
            }) 
        return dataArr             
    })
)

更新3(从then()块中的Promise.all()回调返回后更新 - 仍然无法正常工作

  return Promise.all(result1.map(function(item){
        renderData = {}
        OrgChart.findOne({GID:item.gid},function(err,detail){
                console.log("Detail is ------> " + detail.DISPLAY_NAME)
                if(err){
                    res.send(err)
                }else{
                    return detail.DISPLAY_NAME
                }
            }).exec().then(result2 => {
                renderData.gid = result2.DISPLAY_NAME
                renderData.pageouttime = item.pageouttime
                renderData.createdAt = item.createdAt
                renderData.oncall = item.oncall
                renderData.comments = item.comments
                renderData.actionLink = item._id.toString()              

                return renderData
            })            
    })
)

2 个答案:

答案 0 :(得分:2)

首先,你应该正确promisify你的职能:

$.ajax({
     url: "https://api.linkedin.com/v1/people/~",
     //jsonpCallback: "callback",
     //dataType: "jsonp",
     success: function(data, textStatus, xhr) {
         console.log(data)
     },
     error: function(xhr, textStatus, error) {
         console.log(xhr)
     }
 });

或者,因为你的图书馆似乎支持简单(注意我们没有通过任何回调!):

function findDetails() {
    return new Promise((resolve, reject) => {
        Details.find((err, details) => {
            if (err) reject(err);
            else resolve(details);
        });
    });
}
function findChart(gid) {
    return new Promise((resolve, reject) => {
        OrgChart.findOne({GID:item.gid}, (err, detail) => {
            if (err) reject(err);
            else resolve(detail);
        });
    });
}

现在我们可以从那些构建承诺链(注意所有function findDetails() { return Details.find().exec(); } function findChart(gid) { return OrgChart.findOne({GID:item.gid}).exec(); } 语句!):

return

答案 1 :(得分:0)

如果是你正在使用的Sails(应该在问题中添加标签并提及它),那么根据它支持承诺的documentation。但是文档说承诺是exec替代所以你的代码应该是这样的:

Details.find()
.then(
  result =>
    Promise.all(
      result.map(
        item=>
          OrgChart.findOne({GID:item.gid})
          .then(//here is where your code is confusing
            // does detail have detail.DISPLAY_NAME.DISPLAY_NAME?
            // I assume it has not
            details=>({
              gid : details.DISPLAY_NAME,
              pageouttime : item.pageouttime,
              createdAt : item.createdAt,
              oncall : item.oncall,
              comments : item.comments,
              actionLink : item._id.toString()
            })
          )
      )
  )  
)
.then(
  results=>{
    console.log("results are:",results);
  }
)
.catch(
  err=>console.error("Something went wrong:",err)
);