Javascript 连续运行多个函数,同时等待前一个函数完成

Javascript 连续运行多个函数,同时等待前一个函数完成,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我有一个脚本,它涉及数据处理,然后批量上传/下载文件 我一直在试图找到不同的方法来解决我遇到的问题,我决定尝试这样的方法(这似乎是最简单的解决方案),但我不确定是否可以用JavaScript实现 我不太擅长异步,也不知道该怎么做 提前谢谢,我对下面的工作有一个模糊的概念 函数一(){ >>做点什么|数据处理 }; 函数二(){ >>做点什么|上传/下载文件 }; 函数thr(){ >>做点什么|为一个输出处理两个数组,该输出将被推送到一个全局变量 }; 一个()//等一个完成 二()//等两个人

我有一个脚本,它涉及数据处理,然后批量上传/下载文件

我一直在试图找到不同的方法来解决我遇到的问题,我决定尝试这样的方法(这似乎是最简单的解决方案),但我不确定是否可以用JavaScript实现

我不太擅长异步,也不知道该怎么做

提前谢谢,我对下面的工作有一个模糊的概念

函数一(){
>>做点什么|数据处理
};
函数二(){
>>做点什么|上传/下载文件
};
函数thr(){
>>做点什么|为一个输出处理两个数组,该输出将被推送到一个全局变量
};
一个()//等一个完成
二()//等两个人完成
thr()//等待thr完成
函数二(){
返回新承诺(异步(解析、拒绝)=>{
fs.createReadStream('data.csv')
.pipe(csv())
.on('数据',(行)=>{
如果(行[已删除]='')返回;
常数
url1=行[已删除],
url2=行[已删除],
https=require('https'),
id=行[已删除];
让上传=[];
const fetchRealUrl=request(url1,(e,response)=>{//需要等待完成
const FILENAMEREMOVED1=fs.createWriteStream(`${id}-FILENAMEREMOVED1`),
downloadRealFile=https.get(response.request.uri.href,函数(response){
响应管道(FILENAMEREMOVED1);
log(`FILENAMEREMOVED file${id}已下载。`);
});
}),
fetchRealUrl2=请求(url2,(e,响应)=>{//需要等待完成
const FILENAMEREMOVED2=fs.createWriteStream(`${id}-FILENAMEREMOVED2`),//需要提取到函数中,而不是重复
downloadRealFile2=https.get(response.request.uri.href,函数(response){
响应.管道(FILENAMEREMOVED2);
log(`FILENAMEREMOVEDfile${id}已下载。`);
});
});
//获取数据(url);
upload.push(`{“id”:“${id}”,已删除}`);
})
.on('结束',(行)=>{
控制台信息(“已完成”);
解析(上载);//下载仍在运行时完成
});
});
}
试试看


由于您将其标记为
async
/
wait
,似乎您确实知道应该使用什么。请更详细地向我们展示您使用它的尝试-当您尝试时,什么不起作用?javascript不是多线程的,要获得类似的效果,您需要将工作分解为单元,然后使用async/await与其他单元交错。我不想同时做多件事,“我想同时做一件事来保持秩序。@Bergi我想尝试一下,但我真的不知道怎么做。”。我不擅长异步,但我知道它是什么is@BrendanJennings也许看看我的头发?用“使用
wait
”替换“call
then
”。但不要忘记
返回该链的内部承诺,甚至只是。你可能救了我的命,我现在就开始!试过这个,没用。two().then(…仍然在one()之前运行)。then(…完成了我的天啊,谢谢你!我会出去学习这一切是如何工作的,谢谢你的帮助!你应该在每个返回语句中传递一个新的承诺,而不是像那样嵌套它们。
one()。然后(x=>{return two()})。然后(y=>{//etc)
不过,不要让映射变得那么复杂。只需使用
const promises=[func1(),func2()];const result=Promise.all(promises)
function one() {
    return new Promise((resolve, reject) => { 
        //Do something...
        let x = 10
        resolve(x) 
    }
}

function two() {
    return new Promise((resolve, reject) => {
        //Do something else...
        let y = 20
        resolve(y) 
    }
}

one().then(x => { //The value resolved in one() is passed here

    //then() is executed only when one() resolves its promise

    return two()

}).then(y => { //The value resolved in two() is passed here

    //etc...

})



const func1 = new Promise(res =>{
 setTimeout(() => {
     //do some asynchronous work
            res()
 }, 1000)
})

const func2 = new Promise(res =>{
 setTimeout(() => {
     //do some asynchronous work
            res()
 }, 1000)
})


//To run async functions in a waterfall pattern:
func1()
.then(resultOfFunc1 => {
 //do something with resultOfFunc1
 return func2()
})
.then(resultOfFunc2 => {
 //do something with resultOfFunc2
})

//To run async functions in a parallel pattern:
let promiseFunctions = [func1(), func2()]
let result = Promise.all(promiseFunctions)

//result will be an array of resolved promises