Javascript async.async.瀑布中的每个回调都未触发

Javascript async.async.瀑布中的每个回调都未触发,javascript,node.js,asynchronous,callback,jasmine-node,Javascript,Node.js,Asynchronous,Callback,Jasmine Node,我正在努力实现以下目标: 请考虑在不支持异步/等待但的茉莉花测试框架中运行此操作 瀑布调用一个具有async.each的函数来触发模式和表的创建。异步瀑布中的步骤必须按顺序执行,即在创建表之前必须创建模式。我所面临的问题是,创建模式的第一个调用被执行,但回调永远不会返回到async.瀑布。因此,async.瀑布中的下一步永远不会执行 时间线或流程: driverFunction(异步瀑布)调用createFunction createFunction(asyncCreateSchema等)函数

我正在努力实现以下目标:

<强>请考虑在不支持异步/等待但

的茉莉花测试框架中运行此操作 瀑布调用一个具有async.each的函数来触发模式和表的创建。异步瀑布中的步骤必须按顺序执行,即在创建表之前必须创建模式。我所面临的问题是,创建模式的第一个调用被执行,但回调永远不会返回到async.瀑布。因此,async.瀑布中的下一步永远不会执行

时间线或流程:
driverFunction(异步瀑布)调用createFunction
createFunction(asyncCreateSchema等)函数为数组中的每个文件调用doSomething
doSomething执行jar文件并返回成功或错误

这是我的密码:

“严格使用”
设async=require('async');
函数doSomething(文件,完成){
console.log(文件);
返回完成(null,true);
}
函数asyncCreateSchema(文件,完成){
async.each(
文件夹,
函数(文件、回调){
if(file.startsWith('schema')){
doSomething(文件、回调);
}
否则{
回调();
}
},
功能(err){
如果(错误){
控制台日志(err);
}
log('createschema done');
});
}
函数asyncCreateTables(文件,完成){
async.each(
文件夹,
函数(文件、回调){
if(file.startsWith('table')){
doSomething(文件、回调);
}
否则{
回调();
}
},
功能(err){
如果(错误){
控制台日志(err);
}
log('createschema done');
});
}
var files=['schema.json','schema_1.json','table.json'];
异步瀑布([
下一步=>asyncCreateSchema(文件,下一步),
(nil,next)=>asyncCreateTables(文件,next),
],
函数(err、res){
如果(错误){
抛出新错误(“设置错误:+err.message”);
}否则{
控制台日志(res);
}
}
);
为什么要使用
async.watherfall
函数代替
ES2017
异步/等待

请给我看更多的代码,一些异步代码,而不仅仅是
console.log()
,看看我如何去掉那难看的nodejs异步库,用纯
async/await
语法替换

我刚给你做了一些代码,但我不知道你想要什么,请把代码的时间线也放在上面,例如,这个
fn
先去,然后结果用在另一个

async function doSomething(file) {
    var result = await new Promise((done, error) => {
        console.log(file)
        /* Here you execute async or sync operatios,
           when done, fire the done() if there is an error, you fire the error(error) */
        someTask(file, function(err, data){
            if (err)
                error(err)
            else
                done(data) //This data will be in result
        })
    })
    return result //data passed to done()
}

async function asyncCreateSchema(files, done) {
    for (var file of files) {
        if (file.startsWith('schema'))
            await doSomething(file);
    }
}

async function asyncCreateTables(files) {
    for (var file of files) {
        if (file.startsWith('table'))
            await doSomething(file);
    }
}


async function noNeedOfWaterfall () {
    var files = ['schema.json', 'schema_1.json', 'table.json']
    await asyncCreateSchema(files)
    await asyncCreateTables(files)
}

noNeedOfWaterfall()
    .then(() => console.log('all done'))
    .catch(e => {
        console.log('If you fire the error(err) in doSomething >>', e)
    })

else
的情况下(不存在),
回调
也从未被调用过:
函数(err){if(err){console.log(err);}done(null,true);}
它从未到达此行。不是在结果回调中,不是在迭代回调中<代码>if(file.startsWith('schema'){doSomething(file,callback);}else/*hang!*/@Bergi牛眼。但是,控件从未返回到瀑布!谢谢你的详细解释!您假设的流程是正确的:驱动程序函数调用create函数,对于目录中的每个文件,create函数调用doSomething,doSomething最终执行javajar。关于用法:异步包已经包含在我正在处理的项目中。我相信async包使编写可读代码变得更容易,并且还提供了许多ES2017函数。虽然您已经给了我一个非常好的代码,但是如果能够理解回调在异步包中是如何工作的,那就太好了。您不认为带有for循环和wait的create函数是顺序的吗?我正在尝试实现并行性:例如,如果有十个模式文件,函数应该能够并行启动这些文件。如果要实现并行性,请确保有
承诺。所有[array of data to process]
都允许您获得结果,直到全部完成。