[英]Wait for callback to be returned in a controller
我想上传一些文件,将它们添加到数据库中并返回新对象的ID。
fn: async function (inputs) {
let docIds = []
let settings = {...}
await inputs.filesToUpload.upload(settings, async (err, files) => {
if (err)
throw {'invalid': 'The provided data is invalid.'}
for (let i = 0; i < files.length; i += 1) {
let newDocument = await Document.create({
name: file.filename
}).fetch()
docIds.push(newDocument.id)
}
})
return {
ids: docIds
}
})
不幸的是,控制器不会等待在数据库中创建对象,而是立即返回{ids:[]},只有在上载文档并创建对象之后,控制器才会等待。 我已经尝试过将ID用作回调和Promise,但控制器始终执行return而无需等待结果。
inputs.filesToUpload.upload
进行的回调将始终是异步的。
带有回调的函数之前的async关键字不能使其等待。
仅当函数返回诺言时,异步才起作用
检查以下代码,其中我已在单独的函数中提取了上传流程,该函数返回了Promise
然后您可以等待这个诺言并获取生成的ID。
async function test(inputs) {
const docIds = await upload(inputs, {});
return { ids: docIds };
}
function upload(inputs, settings) {
return new Promise((resolve, reject) => {
const ids = [];
inputs.filesToUpload.upload(settings, async (err, files) => {
if (err) {
return reject({ 'invalid': 'The provided data is invalid.' });
}
for (let i = 0; i < files.length; i += 1) {
let newDocument = await Document.create({ name: file.filename }).fetch();
ids.push(newDocument.id);
}
resolve(ids);
});
});
}
请注意,上面的功能只是在澄清诺言的使用。
它可以通过多种方式实现,特别是如果我们要对其进行优化。
编辑
例如,Promise.all可以用于优化顺序(如果订单无关紧要),例如:
function upload(inputs, settings) {
return new Promise((resolve, reject) => {
const ids = [];
inputs.filesToUpload.upload(settings, async (err, files) => {
if (err) {
return reject({ 'invalid': 'The provided data is invalid.' });
}
const newDocuments = await Promise.all(files.map(file =>
Document.create({ name: file.filename }).fetch())
);
resolve(newDocuments.map(newDocument => newDocument.id));
});
});
}
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.