等待回调在控制器中返回

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

希望对您有所帮助。