Если я создаю функцию в javascript, которая содержит только асинхронные функции, будет ли новая функция также асинхронной? - PullRequest
1 голос
/ 29 декабря 2011

Например, допустим, я создал функцию с именем "foobar", а внутри foobar - вызовы асинхронных функций. Например, это может выглядеть так:

function foobar() {
    // asynchronous function here.
    // asynchronous function here.
}

Теперь, если я вызову foobar () пять раз так:

foobar();
foobar();
foobar();
foobar();
foobar();

Будет ли запускаться одновременно только две асинхронные функции?

Ответы [ 5 ]

2 голосов
/ 29 декабря 2011

Нет, он запустит все 10. Он запустит первые два (асинхронно), затем единственный поток Javascript вернется из первого вызова и войдет во второй, вызовет еще два и т. Д. До тех пор, пока не будут вызваны все 10.Пример:

var i = 0;
function foobar(){
    // Execute functions asynchronously by using setTimeout
    setTimeout(function(){ alert(++i); }, 0);
    setTimeout(function(){ alert(--i); }, 0);
}

foobar();
foobar();
foobar();
foobar();
foobar();
alert('This will ALWAYS alert first');

Последнее предупреждение всегда будет первым, поскольку Javascript является однопоточным, после чего другие предупреждения будут появляться в любом порядке в зависимости от расписания.Вы можете увидеть любое число в диапазоне от -5 до 5, но последнее предупреждение всегда будет 0.

http://jsfiddle.net/Paulpro/uJd44/

1 голос
/ 29 декабря 2011

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

Следовательно, в вашем примере пять вызововзначение foobar() приведет к суммарному запуску десяти асинхронных функций, поскольку все они немедленно вернутся к своему вызывающему.

0 голосов
/ 29 декабря 2011
        foobar();  // It will invoke two asynchronous function and even if they are not   
                 //completely executed control will got to second/next foobar() method invocation
        foobar();  // Irrespective of whether first two asynchronous function have  
                  //completed or not this method will invoke two asynchronous functions  
                 // again. and next //foobar() method call will be executed

        foobar(); // Same continues
        foobar();
        foobar();

Рассмотрим, если ни один из асинхронных методов не завершил выполнение даже после вызова последнего foobar() метода, поэтому будет выполняться десять асинхронных методов.

0 голосов
/ 29 декабря 2011

Общее количество вызовов асинхронной функции внутри foobar будет 10 (5 * 2).

Функции внутри foobar асинхронны, поэтому foobar завершится, пока другие функции все еще заняты. Затем вызывается следующий foobar, запускающий еще две асинхронные функции и т. Д. И т. Д.

Конечно, вы могли бы создать регулятор, чтобы ограничить количество вызовов при быстром запуске foobar друг за другом ...

0 голосов
/ 29 декабря 2011

Я думаю, что каждый раз, когда foobar() вызывает все асинхронные функции, создается новая копия в памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...