我有一些非常重的基于承诺的代码,我正在寻求分手,并转移到异步/等待。
我遇到了一个问题 - 对于以下问题,这是一个很好的设计模式。基本上我有一些依赖于“承诺”的前一步骤的东西。
如何将值传递给下面的块?或者只是初始化它以便我可以保留它?
谢谢, 奥利
let sess;
// if has experts
if (!_.isEmpty(data.expertIds)) {
// create expert campaign sessions
const sessions = await util.createSessions(data.expertIds, newCampaignId);
Promise.all(sessions)
.then((s) => {
// if sessions created, set this var to true!
sess = true;
debug('Sessions created');
})
.catch((error) => { throw error; });
}
debug(sess) // undefined
debug(await sess) // undefined
...lots and losts more code...
let newCampaignId;
// save the new campaign as a draft
newCampaign
.save()
.then((campaign) => {
newCampaignId = campaign._id;
debug('New campaign saved', campaign);
})
.catch((error) => { throw error; });
debug(newCampaignId) // undefined
debug(await newCampaignId) // undefined
答案 0 :(得分:2)
如果您以后需要,则需要从then()
返回值。 then()
返回一个承诺 - 这个返回的承诺是await
所需要的。这是您试图等待的承诺的最终解决价值。例如:
// save the new campaign as a draft
var a_promise = newCampaign
.save()
.then((campaign) => {
debug('New campaign saved', campaign._id);
return campaign._id // make sure you return something
})
debug(await a_promise) // should be defined now
此处返回campaign._id
至关重要。
你制作的构造虽然有点笨拙。由于save()
会返回一个承诺,您应该能够做到:
let campaign = await newCampaign.save()
debug(campaign._id)
当然,所有这些都假设您在async
函数内。