我有下面的链接循环序列,我想使用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
})
})
)
答案 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)
);