保存异步代码node.js的'result'值

时间:2017-11-18 20:43:08

标签: javascript node.js promise async-await

我有一些非常重的基于承诺的代码,我正在寻求分手,并转移到异步/等待。

我遇到了一个问题 - 对于以下问题,这是一个很好的设计模式。基本上我有一些依赖于“承诺”的前一步骤的东西。

如何将值传递给下面的块?或者只是初始化它以便我可以保留它?

谢谢, 奥利

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

1 个答案:

答案 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函数内。