JavaScript, Node.js: является ли Array.forEach асинхронным?

найденный здесь

я просто примерил Windows XP, он работал

локальный компьютер: кв/см \\. удалите [сервисное имя]

  Deleting services in Windows Server 2003

  We can use sc.exe in the Windows Server 2003 to control services, create services and delete services. Since some people thought they must directly modify the registry to delete a service, I would like to share how to use sc.exe to delete a service without directly modifying the registry so that decreased the possibility for system failures.

  To delete a service: 

  Click “start“ - “run“, and then enter “cmd“ to open Microsoft Command Console.

  Enter command:

  sc servername delete servicename

  For instance, sc \\dc delete myservice

  (Note: In this example, dc is my Domain Controller Server name, which is not the local machine, myservice is the name of the service I want to delete on the DC server.)

  Below is the official help of all sc functions:

  DESCRIPTION:
    SC is a command line program used for communicating with the
    NT Service Controller and services. 
  USAGE:
          sc

357
задан Yves M. 29 December 2014 в 00:36
поделиться

1 ответ

Это не асинхронный. Это блокировка. Те, кто сначала изучил язык, такой как Java, C или Python, прежде чем попробовать JS, запутаются, когда попытаются ввести произвольную задержку или вызов API в теле цикла.

Скажем, вы попробуете это:

const array = [1, 2, 3, 4, 5];

array.forEach((el, i) => {
    setTimeout(() => {
        console.log(el);
    }, 1000);
});

Код выполняется по порядку, и следующая итерация цикла не начинается, пока предыдущая не прошла свою последнюю строку.

Вы, вероятно, ожидаете, что setTimeout задержит выполнение до тех пор, пока не истечет время вашей задержки. Это не так, потому что метод setTimeout фактически возвращает значение немедленно. В Node.js он возвращает объект Timeout, а в браузере возвращает число, указывающее на экземпляр timeout.

Когда что-то возвращается, начинается выполнение следующей строки. Таким образом, вы получаете этот эффект, когда программа выполняется чуть более 1 секунды, и перед закрытием она выдает 5 консольных журналов почти одновременно.

Если вы хотите, чтобы ваш тайм-аут заставил цикл ждать, пока не пройдет его задержка, вы можете использовать следующий код.

function forEachWithCallback(callback) {
    const arrayCopy = this;
    let index = 0;
    const next = () => {
        index++;
        if (arrayCopy.length > 0) {
            callback(arrayCopy.shift(), index, next);
        }
    }
    next();
}

Array.prototype.forEachWithCallback = forEachWithCallback;

const array = [1, 2, 3, 4, 5];

array.forEachWithCallback((el, i, next) => {
    setTimeout(() => {
        console.log(el);
        next();
    }, 1000);
});

Вместо использования собственного метода forEach, который поставляется с массивами JS, вы можете добавить свой собственный с обратным вызовом. Использование этого заставит ваши итерации ждать истечения времени ожидания их предшественника. Следующая итерация не может начаться до тех пор, пока в теле вашего цикла не будет вызван «следующий» метод. Таким образом, выполнение этого кода займет чуть более 5 секунд, и один раз в секунду будет один файл console.log.

Это хорошо работает и с JS Promises, например, когда вы хотите сделать ajax.

// "request" implementation can be found in the link at the bottom of this answer

const array = [1, 2, 3, 4, 5];

array.forEachWithPromise((el, i, next) => {
    request({
        method: 'GET',
        hostname: 'httpbin.org',
        path: '/get?myArg=' + el
    }).then((res) => {
        const responseBody = JSON.parse(res.body);
        console.log(responseBody.args.myArg);
        next();
    }).error((err) => {
        console.error(err);
    });
});

Ниже приведен список бесплатных программ, которые вы можете использовать как в браузере, так и в Node.js для создания циклов for-each, без внешних пакетов или зависимостей. https://gist.github.com/ajb413/d55489eec64db0bb4079a8d7af733aab

0
ответ дан 28 July 2019 в 11:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: