繁体   English   中英

等待回调在控制器中返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM