javascript - 承诺,更新父范围变量
问题描述
我有这个代码:
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
})
解决方案
例如使用异步/等待:
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');
},
);
推荐阅读
- python - 如何通过 __reduce__ 实现代码执行进行酸洗?
- reactjs - 如何在 AWS 中启用 API Gateway 和 React 应用程序之间的 CORS 策略?
- c - 什么是 Solaris 11 中用于编译 c 程序的 CC 编译器。make 文件指定类似“CC=cc -Xa -mt -xc99=no_lib”
- javascript - 如何从 json 数组中删除名称字段?
- visual-studio - 调试服务时,如何配置 Visual Studio 以使用 --remote-debugging-port=9222 启动 Chrome?
- javascript - Textarea 和复选框导致提交按钮在 Firefox 中失败
- java - 在 Spring MVC 休眠中验证用户名和密码
- dart - 如何从 Dart 程序中打开文件描述符(三)
- extjs - 如何仅取消选择网格中的某些行?
- python - 如何在 postgresql 语句中插入值,错误消息:字符串格式化期间并非所有参数都转换