Javascript: как запускать последовательно медленные функции? - PullRequest
0 голосов
/ 21 мая 2019

Я не опытный программист Javascript, но мне очень трудно выполнять 2 трудоемкие функции в строке.

Я потратил несколько дней на изучение обещаний или асинхронности / ожидания, но пока не достиг успеха.

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

В большинстве примеров описываются функции get json, setTimeOut и т. Д. Но в моем случае мне приходится выполнять сложные математические вычисления и требуется последовательное выполнение. Как я мог это сделать?

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Вы можете обернуть свои функции в обещание, подобное этому, и разрешить его, только если вы хотите, чтобы код продолжал:

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");   
  });
})

Этот код должен подождать 1 секунду для каждой функции, прежде чем ее "synch 2" console.log ()

ИЛИ , вы можете использовать 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()
0 голосов
/ 21 мая 2019

Зависит от того, что вы пытаетесь достичь и какова среда.Я предполагаю, что медленная функция блокирует, и вы собираетесь, чтобы основной поток не блокировался во время выполнения.Предполагая, что вы говорите о:

  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;
  }
};
Node.js
0 голосов
/ 21 мая 2019

Вы правильно поняли, вы пытаетесь выполнить задачу 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')
})
...