gpt4 book ai didi

Javascript/NodeJS : html rendering before . 在 forEach 内查找完成

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:16 24 4
gpt4 key购买 nike

此循环应该检查数据库中与从 salesforce api 结果中提取的 opp 相匹配的 opp,然后创建一个新的 opp 或查找现有的 opp 并将其推送到数组。看起来 res.render 在找到 opp 之前就已经运行了。它创建一个新的 opp,但在页面呈现时数组返回空。

 Account.find({owner:req.user._id, prospect:'false'}).sort({ammount:'desc'}).populate({path: "notes", options:{ sort:{ 'date': -1 } } }).exec(function(err, allAccounts) {
let callGoal = req.user.callGoal;
if(err){
res.send(err);
}else{
// if auth has not been set, redirect to index
if (!req.session.accessToken || !req.session.instanceUrl) { res.redirect('/'); }
//SOQL query
let q = "SELECT Id,Amount,CloseDate,LastActivityDate,Name,StageName,account.Name FROM Opportunity WHERE CloseDate < 2018-10-01 AND OwnerId = '0050a00000J12PdAAJ' AND IsClosed = false AND StageName != 'Stage 6: Won'";
//instantiate connection
let conn = new jsforce.Connection({
oauth2 : {oauth2},
accessToken: req.session.accessToken,
instanceUrl: req.session.instanceUrl
});
//set records array
let softopps = [];
let sfOpps = [];
let query = conn.query(q)
.on("record", function(record) {
sfOpps.push(record);
})
.on("end", function() {
console.log("total in database : " + query.totalSize);
console.log("total fetched : " + query.totalFetched);
let user = req.user;
sfOpps.forEach(function(sfopp){
if(err){
res.send(err);
}else{
Opp.findOne({sfid:sfopp.Id}).exec(function(err, opp){
if(!opp.length){
Opp.create(req.body, function(err, newOpp) {
if(err){
res.send(err)
}else{
newOpp.sfid = sfopp.Id;
newOpp.name = sfopp.Name;
newOpp.owner = user.sfid;
newOpp.save();
return softopps.push(newOpp)
}
})
}else{
return softopps.push(opp);
}
})
}
})
res.render("myaccounts", {accounts:allAccounts, callGoal:callGoal, user:user, sfOpps:sfOpps, opps:softopps});
})
.on("error", function(err) {
console.error(err);
})
.run({ autoFetch : true, maxFetch : 4000 });
}
});

最佳答案

您的 Opp.findOne()Opp.create() 调用是异步的,因此它们在 res.render() 之后触发。

<小时/>

另一方面,你几乎会因为所有不必要的请求而杀死你的 mongodb。

尝试这个逻辑(从 .forEach 开始)

  1. sfOpps id 查找所有 Opp
  2. 找出未找到的 Opp 并创建它们
  3. 连接所有找到和未找到的Opps
  4. 然后,只有那时回应

我没有测试该代码,但它可以让您大致了解我的意思

Opp.find({ sfid : { $in: sfOpps.map(opp => opp.id) } })
.then(found => {

const foundIds = found.map(opp => opp.sfid)
const notFound = sfOpps.filter(opp => !foundIds.includes(opp.sfid)).map(sfopp => {
return {
sfid: sfopp.sfid,
name: sfopp.name,
owner: user.sfid
}
})

Opp.insertMany(notFound)
.then((insertResult) => {

res.render("myaccounts", {
accounts: allAccounts,
callGoal: callGoal,
user: user,
sfOpps: found.concat(notFound),
opps: softopps
});

}).catch(handleError)

}).catch(handleError)

关于Javascript/NodeJS : html rendering before . 在 forEach 内查找完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com