等待回调在控制器中返回
Wait for callback to be returned in a controller
我想上传一些文件,将它们添加到数据库和 return 新对象的 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
}
})
不幸的是,控制器不会立即等待在数据库中创建对象和 returns {ids: []},然后才上传文档并创建对象。我尝试使用传递 id 作为回调和承诺,但控制器总是执行 return 而无需等待结果。
inputs.filesToUpload.upload
正在执行始终异步的回调。
回调函数前的 async 关键字不能让它等待。
异步仅在函数返回 promise 时有效
检查以下代码,其中我在一个单独的函数中提取了上传流程,returns 一个承诺
然后您可以等待这个承诺并获得生成的 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);
});
});
}
请注意,上述功能只是为了阐明 promises 的使用。
如果我们要优化的话,具体可以通过多种方式实现。
EDIT
例如,如果顺序不是问题,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));
});
});
}
希望对您有所帮助。
我想上传一些文件,将它们添加到数据库和 return 新对象的 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
}
})
不幸的是,控制器不会立即等待在数据库中创建对象和 returns {ids: []},然后才上传文档并创建对象。我尝试使用传递 id 作为回调和承诺,但控制器总是执行 return 而无需等待结果。
inputs.filesToUpload.upload
正在执行始终异步的回调。
回调函数前的 async 关键字不能让它等待。
异步仅在函数返回 promise 时有效
检查以下代码,其中我在一个单独的函数中提取了上传流程,returns 一个承诺
然后您可以等待这个承诺并获得生成的 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);
});
});
}
请注意,上述功能只是为了阐明 promises 的使用。
如果我们要优化的话,具体可以通过多种方式实现。
EDIT
例如,如果顺序不是问题,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));
});
});
}
希望对您有所帮助。