我不是经验丰富的Javascript程序员,但我发现很难在行中执行两个耗时的函数。
到目前为止,我已经花了几天时间研究诺言或异步/等待,但尚未成功。
console.log("synch 1");
slowFunction1();
slowFunction2();
console.log("synch 2");
大多数示例描述了get json函数,setTimeOut等。但是在我的情况下,我必须进行大量的数学计算,并且需要顺序执行。我该怎么办?
答案 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)
取决于您要实现的目标和环境。我将假设慢速功能正在阻塞,并且您要在执行期间不要阻塞主线程。假设您在谈论:
一些示例代码为:
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;
}
};