Js неблокирующая функция - PullRequest
0 голосов
/ 15 ноября 2018

Привет, я новичок в JS, и у меня проблема с этим: Моя задача - преобразовать эту блокирующую функцию в неблокирующую функцию, Вы можете помочь?

Оригинальный код:

setTimeout(() => console.log('Blocked!'), 1000);
    function blocking() {
      let a = 0;
      for (let i = 0; i < 1000; i++) {
        for(let j = 0; j < i * 10000; j++) {
            if (i < j) {
                   a++;
                 }
               }
            }
         }
blocking();

Мое первое решение, оно совсем не работает, не блокирует мой пользовательский интерфейс, но нет журналов консоли с номером a:

function function1()
{
    let a=0;
    let i=0;

    console.log("start");
    (function (){
    var condition = true;
        function codeBlock()
        {
            if (condition === true)
            {
                {
                   for(let j = 0; j < i * 10000; j++)
                   {

                       if (i<j)
                       {
                           a++;

                       }
                   }
                }
                console.log(a);
                if (i<1000)
                    i++;
                else
                    condition = false;
                setTimeout(codeBlock,100);
            }
            else
            {
                console.log("done");
            }
        }
    })
}

function1();

Моя вторая попытка ее решения: этот тоже не работает, блокирует пользовательский интерфейс.

let a = 0;

function inner(i)
{
     for(let j = 0; j < i * 10000; j++) {
            if (i < j) {
            a++;
            }
        }
}

function blocking() {
    for (let i = 0; i < 1000; i++) {
        setTimeout(inner, i*50,i);
    }
}

console.log('Starting!')
blocking();
console.log('Done!')

1 Ответ

0 голосов
/ 15 ноября 2018

Что вы подразумеваете под неблокированием? Если вы действительно хотите отдельный поток, вам придется использовать своего рода веб-работника.

Если вы просто хотите, чтобы ваш код продолжал работать после вызова функции, вы можете использовать setTimeouts.

Просто оберните код, который вы хотите продолжить выполнять после разрешения обратных вызовов стека вызовов. Нечто подобное должно работать (немного преувеличено):

function nonBlocking() {
  setTimeout(function() {
    let a = 0;
    setTimeout(() => {
      for (let i = 0; i < 1000; i++) {
        setTimeout(() => {
          for (let j = 0; j < i * 1000; j++) {
            if (i < j) {
              a++;
            }
          }
        }, 0);
      }
    }, 0);
  }, 0);
}

Я бы также порекомендовал вам посмотреть это видео:

https://www.youtube.com/watch?v=8aGhZQkoFbQ

...