Обещание, обновить родительскую переменную области видимости
У меня есть этот код:
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');
},
);