Javascript:如何按顺序运行缓慢的函数?

Javascript:如何按顺序运行缓慢的函数?,javascript,asynchronous,async-await,sequential,Javascript,Asynchronous,Async Await,Sequential,我不是一个有经验的Javascript程序员,但我发现在一行中执行2个耗时的函数非常困难 我花了几天时间研究promises或async/await,但到目前为止还没有成功 console.log("synch 1"); slowFunction1(); slowFunction2(); console.log("synch 2"); 大多数示例都描述了get json函数、setTimeOut等。但在我的例子中,我必须进行大量的数学计算,并且需要顺序执行。我如何才能做到这一点?您可以将函数

我不是一个有经验的Javascript程序员,但我发现在一行中执行2个耗时的函数非常困难

我花了几天时间研究promises或async/await,但到目前为止还没有成功

console.log("synch 1");
slowFunction1();
slowFunction2();
console.log("synch 2"); 

大多数示例都描述了get json函数、setTimeOut等。但在我的例子中,我必须进行大量的数学计算,并且需要顺序执行。我如何才能做到这一点?

您可以将函数包装成这样的承诺,并且只有在希望代码继续时才能解析:

函数slowFunction1(){
返回新承诺(解决=>{
setTimeout(()=>resolve(),1000)
})
}
函数slowFunction2(){
返回新承诺(解决=>{
setTimeout(()=>resolve(),1000)
})
}
console.log(“同步1”);
slowFunction1()。然后(()=>{
slowFunction2()。然后(()=>{
console.log(“同步2”);
});

})
您可以将您的函数包装成这样的承诺,并且只有在希望代码继续时才能解决:

函数slowFunction1(){
返回新承诺(解决=>{
setTimeout(()=>resolve(),1000)
})
}
函数slowFunction2(){
返回新承诺(解决=>{
setTimeout(()=>resolve(),1000)
})
}
console.log(“同步1”);
slowFunction1()。然后(()=>{
slowFunction2()。然后(()=>{
console.log(“同步2”);
});

})
如果你做对了,你正在尝试实现一项非同步的任务

异步任务

需要一段时间才能完成的任务

方式1-回调

您需要对进一步的任务进行回调。 让我给你举个例子

函数myHugeTask(回调){
//我需要完成我的任务
log('嘿,我是第一个任务')
回调函数()
}
const someTaskwhichchinesedtoexecutelater=()=>{
log('嘿,我在完成第一个任务')
}

myHugeTask(一个被设置为执行器的任务)
你做对了,你正在尝试实现一个
非同步的任务

异步任务

需要一段时间才能完成的任务

方式1-回调

您需要对进一步的任务进行回调。 让我给你举个例子

函数myHugeTask(回调){
//我需要完成我的任务
log('嘿,我是第一个任务')
回调函数()
}
const someTaskwhichchinesedtoexecutelater=()=>{
log('嘿,我在完成第一个任务')
}

myHugeTask(一些被设置为执行器的任务)
取决于您试图实现的目标和环境。我将假设slow函数是阻塞的,并且您希望主线程在执行期间不会被阻塞。假设您正在谈论:

  • 网站:
    • 网络工作者是你最好的选择()
  • 一些示例代码是:

    var myWorker = new Worker('file-containing-slow-code.js');
    myWorker.postMessage({execute: 'slowFunction1'});
    myWorker.onmessage((msg) => {
      const {result, functionExecuted} = msg.data;
      console.log(result);
    });
    
  • Node.js
    • 使用子进程()

  • 这取决于你想要实现的目标和环境。我将假设slow函数是阻塞的,并且您希望主线程在执行期间不会被阻塞。假设您正在谈论:

  • 网站:
    • 网络工作者是你最好的选择()
  • 一些示例代码是:

    var myWorker = new Worker('file-containing-slow-code.js');
    myWorker.postMessage({execute: 'slowFunction1'});
    myWorker.onmessage((msg) => {
      const {result, functionExecuted} = msg.data;
      console.log(result);
    });
    
  • Node.js
    • 使用子进程()


  • 您研究过Promise吗?您想同时运行slowFunction1和SlowFunction2吗?请注意,即使异步运行慢速函数,它们也很可能不会在不同的线程中执行。所以它们不会并行运行——它们仍然会按顺序执行,但它们之间可能会有一点“喘息空间”。例如,这可以允许UI在调用之间进行跟踪和更新。这就是你想要的,还是你想同时运行它们?这篇文章可能会有所帮助:我总是喜欢一个否决的理由,而不是问题/答案。它真的帮助人们自信地在社区中成长。原因有助于防止将来出现错误您是否研究过Promise?您希望同时运行slowFunction1和SlowFunction2?请注意,即使异步运行慢速函数,它们也很可能不会在不同的线程中执行。所以它们不会并行运行——它们仍然会按顺序执行,但它们之间可能会有一点“喘息空间”。例如,这可以允许UI在调用之间进行跟踪和更新。这就是你想要的,还是你想同时运行它们?这篇文章可能会有所帮助:我总是喜欢一个否决的理由,而不是问题/答案。它真的帮助人们自信地在社区中成长。原因有助于防止将来出现错误我想我可以更好地理解async/await,但让我困惑的是,例如,我应该在slowFunction2()中插入所有数学函数的确切位置。就在上面返回新的承诺?我必须首先知道你的数学函数是什么:p这些函数类似于CalculateAverage(数组[20000]);CalculatePearsonChiSquareTest(数组[20000]);我已经成功地按顺序运行了它们,没有问题,它们都在一个函数doccalculations(array[2000])中运行。现在我想在上面的示例中插入doCalculation(),但我对语法感到困惑。这个函数必须在进入下一步之前完成。我建议用每个函数的代码创建另一个问题,并在那里提问。尝试解决我在评论部分所知甚少的问题是个坏主意。如果您愿意,您可以创建一个问题并将链接发送给我,我将查看一下。让我困惑的是return:return new Promise(resolve=>{setTimeout(()=>resolve(),1000)}中setTimeout的用法。我知道它是用来模拟一个慢函数的。如果我有一个mySlowFunc(),那么如何将其插入到您的示例中呢?我想我可以更好地理解async/await,但让我困惑的是,我应该在slowFu中插入所有数学函数的确切位置