Javascript 等待在控制器中返回回调

Javascript 等待在控制器中返回回调,javascript,node.js,sails.js,Javascript,Node.js,Sails.js,我想上传一些文件,将它们添加到数据库并返回新对象的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.'}

我想上传一些文件,将它们添加到数据库并返回新对象的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
  }
})
fn:异步函数(输入){
让docIds=[]
让设置={…}
等待输入.filesToUpload.upload(设置,异步(错误,文件)=>{
如果(错误)
抛出{'invalid':'提供的数据无效。}
for(设i=0;i

不幸的是,控制器没有等待在数据库中创建对象并立即返回{ids:[]},只有在上传文档并创建对象之后。我曾尝试使用传递ID作为回调和承诺,但控制器总是在不等待结果的情况下执行return。

输入。filesToUpload.upload
正在进行回调,而回调总是异步的

带有回调的函数之前的async关键字不能使其等待

async仅在函数返回承诺时工作

检查下面的代码,我在一个单独的函数中提取了上传流,该函数返回一个承诺

然后,您可以等待这个承诺并获得生成的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);
        });
    });
}

我希望这能有所帮助。

我可以在这里给出答案,但这篇老文章给出了比我能给出的更好的解释/解决方案,请查看:只是不要忘记返回拒绝方法。您不想在出现错误后继续。确实!感谢@hlozancic的更正。理想情况下,我应该使用
try-catch
来确保捕获未捕获的异常,特别是来自等待调用的异常。我只是专注于主要问题,最后编写了一个伪代码,这肯定有很大的改进空间。我已经按照您的建议更正了代码,谢谢:)
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));
        });
    });
}