Обещание, обновить родительскую переменную области видимости

У меня есть этот код:

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
})

1 ответ

Решение

Используя async/await, например:

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

Другие вопросы по тегам