Javascript:如何依次运行慢速功能?

时间:2019-05-21 11:53:37

标签: javascript asynchronous async-await sequential

我不是经验丰富的Javascript程序员,但我发现很难在行中执行两个耗时的函数。

到目前为止,我已经花了几天时间研究诺言或异步/等待,但尚未成功。

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

大多数示例描述了get json函数,setTimeOut等。但是在我的情况下,我必须进行大量的数学计算,并且需要顺序执行。我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以将函数包装在这样的Promise中,并且仅在希望代码继续执行时解决:

function slowFunction1() {
  return new Promise(resolve => {
    setTimeout(() => resolve(), 1000)
  })
}

function slowFunction2() {
  return new Promise(resolve => {
    setTimeout(() => resolve(), 1000)
  })
}


console.log("synch 1");
slowFunction1().then(() => {
  slowFunction2().then(() => {
    console.log("synch 2");   
  });
})

对于每个功能,此代码应在console.log()的“同步2”之前等待1秒

OR ,您可以使用async / await而不是.then(),如下所示:

function slowFunction1() {
  return new Promise(resolve => {
    setTimeout(() => resolve(), 1000)
  })
}

function slowFunction2() {
  return new Promise(resolve => {
    setTimeout(() => resolve(), 1000)
  })
}

async function main() {
  console.log("synch 1");
  await slowFunction1()
  await slowFunction2()
  console.log("synch 2");   
}

main()

答案 1 :(得分:0)

您说对了,您正在尝试完成asychronous任务。

异步任务

一项任务需要一些时间才能完成。

方法1-回调

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

function myHugeTask(callback) {
  // I need to do my task
 console.log('Hey I am  first task')
 callback() 
}

const someTaskWhichINeedToExecuteLater = () => {
 console.log('Hey I am after the first task')
}

myHugeTask(someTaskWhichINeedToExecuteLater)

方法2-承诺

承诺就像现实世界中的承诺。如果我答应过您,那么我要么完成,要么拒绝。

让我们看看

const myHugeTaskPromise = new Promise(resolve => {
  // Do my huge  task no matter how much time it takes
  console.log('I will complete first')
  resolve()
})

myHugeTaskPromise.then(()=>{
  console.log('Need to done when my promise get fulfilled')
})

答案 2 :(得分:0)

取决于您要实现的目标和环境。我将假设慢速功能正在阻塞,并且您要在执行期间不要阻塞主线程。假设您在谈论:

  1. 网站:

一些示例代码为:

var myWorker = new Worker('file-containing-slow-code.js');
myWorker.postMessage({execute: 'slowFunction1'});
myWorker.onmessage((msg) => {
  const {result, functionExecuted} = msg.data;
  console.log(result);
});
//contents of file-containing-slow-code.js
onmessage = function(e) {
  var result = funcs[e.data.execute]();
  postMessage({result, functionExecuted: e.data.execute});
}

const funcs = { 
  slowFunction1: () => {
    // do slow stuff;
  }
};
  1. Node.js