等待承诺 - NodeJs
Await promise - NodeJs
我正在尝试根据 leadId.length
为变量 myleadId
赋值。
目标是 myleadId
在这一步之后会有一个值来继续下一步。问题是当 leadId.length <= 0
(其他条件)时 myleadId
是 undefined
。
app.post('/sendMessage2agent', async (req, res) => {
getEnterpriseIDbyContact(req.body.recipient, knex).then((enterpriseId) => {
getLeadIDbyContact(req.body.sender, knex).then((leadId) => {
var myleadId;
if (leadId.length > 0) {
myleadId = leadId; //works great!
} else {
getChannelIdByName(req.body.channel, knex).then((channelId) => {
return createLeadOnEnterprise(req.body.sender, enterpriseId, channelId, knex).then((newleadId) => {
console.log('newleadId: ' + newleadId); //newleadId is 5
myleadId = [{'id': newleadId}]; //doesn't work :(
return;
});
});
}
console.log('myleadId: ' + JSON.stringify(myleadId)); // myleadId is undefined when leadId.length>0 is false. I expect myleadId=[{'id': 5}]
});
res.json(req.body);
});
});
问题是您没有等待您的承诺。这样,他们将在与您的 console.log
不同的时间完成。您还应该看到消息 myleadId: ...
出现在控制台中的 newleadId: ...
之前。这是因为 promise 是异步执行的。所以他们让其他代码在他们执行的时候继续执行。为确保在继续执行主函数之前等待承诺,您应该使用 await
。有了它,您还可以删除 .then
回调以提高可读性。
app.post('/sendMessage2agent', async (req, res) => {
const enterpriseId = await getEnterpriseIDbyContact(req.body.recipient, knex);
const leadId = await getLeadIDbyContact(req.body.sender, knex);
let myleadId;
if (leadId.length > 0) {
myleadId = leadId;
} else {
const channelId = await getChannelIdByName(req.body.channel, knex);
const newleadId = await createLeadOnEnterprise(req.body.sender, enterpriseId, channelId, knex);
console.log('newleadId: ' + newleadId);
myleadId = [{'id': newleadId}];
}
console.log('myleadId: ' + JSON.stringify(myleadId));
res.json(req.body);
});
我正在尝试根据 leadId.length
为变量 myleadId
赋值。
目标是 myleadId
在这一步之后会有一个值来继续下一步。问题是当 leadId.length <= 0
(其他条件)时 myleadId
是 undefined
。
app.post('/sendMessage2agent', async (req, res) => {
getEnterpriseIDbyContact(req.body.recipient, knex).then((enterpriseId) => {
getLeadIDbyContact(req.body.sender, knex).then((leadId) => {
var myleadId;
if (leadId.length > 0) {
myleadId = leadId; //works great!
} else {
getChannelIdByName(req.body.channel, knex).then((channelId) => {
return createLeadOnEnterprise(req.body.sender, enterpriseId, channelId, knex).then((newleadId) => {
console.log('newleadId: ' + newleadId); //newleadId is 5
myleadId = [{'id': newleadId}]; //doesn't work :(
return;
});
});
}
console.log('myleadId: ' + JSON.stringify(myleadId)); // myleadId is undefined when leadId.length>0 is false. I expect myleadId=[{'id': 5}]
});
res.json(req.body);
});
});
问题是您没有等待您的承诺。这样,他们将在与您的 console.log
不同的时间完成。您还应该看到消息 myleadId: ...
出现在控制台中的 newleadId: ...
之前。这是因为 promise 是异步执行的。所以他们让其他代码在他们执行的时候继续执行。为确保在继续执行主函数之前等待承诺,您应该使用 await
。有了它,您还可以删除 .then
回调以提高可读性。
app.post('/sendMessage2agent', async (req, res) => {
const enterpriseId = await getEnterpriseIDbyContact(req.body.recipient, knex);
const leadId = await getLeadIDbyContact(req.body.sender, knex);
let myleadId;
if (leadId.length > 0) {
myleadId = leadId;
} else {
const channelId = await getChannelIdByName(req.body.channel, knex);
const newleadId = await createLeadOnEnterprise(req.body.sender, enterpriseId, channelId, knex);
console.log('newleadId: ' + newleadId);
myleadId = [{'id': newleadId}];
}
console.log('myleadId: ' + JSON.stringify(myleadId));
res.json(req.body);
});