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