承诺,更新父范围变量

时间:2018-09-05 01:44:08

标签: javascript mongoose ecmascript-6 promise es6-promise

我有此代码:

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不能回答我的问题,因为它提出的解决方案包括直接修改在我的情况下产生承诺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
})

1 个答案:

答案 0 :(得分:0)

例如使用异步/等待:

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');
  },
);