首页 > 解决方案 > 承诺,更新父范围变量

问题描述

我有这个代码:

router.put('/test', (ctx, next) => {
  post.create(something, (err, newPost) => {
    if (err) return
    ctx.body = newPost
  })
  console.log(ctx.body) // => undefined
  ctx.status = 200
})

问题是我在回调中为 ctx.body 变量设置的值在回调之外丢失。而且我无法让它发挥作用。我试过bind/async await但没有成功。你能帮助我吗 ?

编辑:@CertainPerformance,您链接的“重复”帖子没有回答我的问题,因为它提出的解决方案包括直接修改post.create在我的案例中产生承诺的函数签名。我不能简单地这样做,因为它是 Mongoose API 的一部分。我阅读了整篇文章,但没有找到解决方案。那么我们如何处理这篇文章呢?

编辑:根据下面的答案,我找到了两个解决方案:

router.put('/test', async (ctx, next) => {
  const newPost = await Post.create(something).then(post => post)
  ctx.body = newPost
  ctx.status = 200
})

router.put('/test', async (ctx, next) => {
  const newPost = new Post(something)
  await newPost.save()
  ctx.body = newPost
  ctx.status = 200
})

标签: javascriptmongooseecmascript-6promisees6-promise

解决方案


例如使用异步/等待:

createPromisified(data) {
  return new Promise((resolve, reject) => {
    post.create(data, (err, ret) => {
      if (err) return reject(err);

      return resolve(ret);
    });
  });
}

router.put('/test', async(ctx, next) => {
  await createPromisified(something);

  ctx.body = newPost;
 
  ctx.status = 200;
})


使用代表您的案例的通用代码示例:

function postCreate(data, callback) {
  setTimeout(() => callback(false, 'ret'), 300);
}

function createPromisified(data) {
  return new Promise((resolve, reject) => {
    postCreate(data, (err, ret) => {
      if (err) return reject(err);

      return resolve(ret);
    });
  });
}

async function routerPut(ctx, next) {
  await createPromisified('something');

  console.log(ctx.body);

  ctx.body = 'newData';

  console.log(ctx.body);

  ctx.status = 200;
}


routerPut({
    body: 'hey',
  },

  () => {
    console.log('next');
  },
);


推荐阅读