2013-07-14 2 views
-2

Допустит, у меня есть синхронная функция, например:асинхронного вызов функции синхронного

var sum = function(x,y){ 
    return x+y 
} 

Я хочу, чтобы вызвать эту функцию в асинхронном режиме. Как это возможно? Является ли функция ниже рассматриваться как асинхронная функция? Если это асинхронная функция, тогда журнал второй функции должен регистрироваться до первого? Я знаю, что это очень простой пример, который не может быть идеальным для асинхронной функции. Но я просто хотел понять это.

function(a, b, c, d, e, f, function(){ 
    console.log(result); 
}) 
{ 
    result = sum(a, b); 
    result = sum(result, c); 
    result = sum(result, d); 
    result = sum(result, e); 
    result = sum(result, f); 
    return 
)}; 


function(a, b, function(){ 
    console.log(result); 
}) 
{ 
    result = sum(a, b); 
    return 
)}; 

Пожалуйста, помогите мне. Если это не правильно, пожалуйста, помогите мне в том, как это должно быть написано?

+0

Вы, кажется, не понимаете обратные вызовы и асинхронное программирование. У вас нет ничего асинхронного в вашем коде. –

+0

Я вижу, что это помечено node.js, поэтому я укажу вам на этот поток: http://stackoverflow.com/questions/5786016/how-do-i-make-this-js-function-asynchronous, который обращается к некоторым , если не большинство, ваши вопросы. –

+0

Этот код не анализируется (вы используете выражение функции, где ожидается имя аргумента в обеих определяемых вами параметрах внешнего уровня, и есть некорректные совпадения с параметрами paren/brace). –

ответ

3

Ваш комментарий на ответ Квентина

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

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

NodeJS делает. Фактически, у него есть несколько из них: setTimeout (что немного похоже на то, что дают вам браузеры), setImmediate и process.nextTick. Для вашего случая использования, setImmediate, вероятно, лучший выбор, но see this question and its answers for more on that. setImmediate выглядит следующим образом:

setImmediate(functionToCall); 

(Это общемировое, вы не должен ничего require.)

Это именно то, что просит ваш заголовок для: асинхронного вызова к синхронной функции.


Ваш комментарий ниже:

Мне просто нужно создать функцию асинхронной, внутри которого я называю нормальной синхронной функции. Когда я имею в виду асинхронную функцию Я имею в виду, что, когда я называю эту функцию она не препятствует потоку, и поток переходит к следующей функции и эта функция может сделать что-то (например, лесозаготовки) после завершения

Это не совсем такой же предмет ваш вопрос спрашивает. :-)

Во-первых, нет асинхронных функций (в JavaScript). Когда вы вызываете функцию в JavaScript, эта функция выполняется синхронно. Значит, у вас есть два варианта:

  1. Вызывающий код может использовать setImmediate сказать Node для вызова функции асинхронно или

  2. Функция может сделать это для себя, вероятно, используя вложенную функцию.

Вот # 1:

function foo() { 
    console.log("A"); 
    setImmediate(bar); 
    console.log("B"); 
} 
function bar() { 
    console.log("C"); 
} 
foo(); 

, который выводит:

A 
B 
C

Вот # 2:

function foo() { 
    console.log("A"); 
    bar("C"); 
    console.log("B"); 
} 
function bar(arg) { 

    setImmediate(run); 

    function run() { 
     console.log(arg); 
    } 
} 
foo(); 

... который также выводит

A 
B 
C

Обратите внимание, что в качестве аргумента для bar принят знак «С». bar не делает ничего, кроме графика обратного вызова к его вложенной функции run. run использует аргумент.

+0

Нет, мне не нужно планировать его.Мне просто нужно создать асинхронную функцию, внутри которой я вызываю обычную синхронную функцию. Когда я имею в виду асинхронную функцию, я имею в виду, что когда я вызываю эту функцию, она не препятствует потоку, и поток переходит к следующей функции, и эта функция может выполнять что-то (например, протоколирование) после завершения. –

+0

Тот же способ означает, какой путь? Я не понимал, каким образом ты имеешь в виду. –

+0

Пожалуйста, отредактируйте свой ответ на примере. Это будет намного лучше в понимании. –

0

Как это возможно?

Это не так. Все, что он делает, - это синхронная операция.

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

Является ли функция ниже рассматриваться как асинхронная функция?

№ У него есть обратный вызов, но все, что он делает, является синхронным.

+0

Чем я мог бы реализовать что-то подобное? –

+0

Вы бы этого не сделали, потому что нет смысла это делать. – Quentin

+0

Что не имеет смысла? В принципе, я хочу знать, как создать асинхронную функцию, внутри которой я вызываю обычную синхронную функцию, которая возвращает что-то. –

-2

В Javascript (оставляя узел на некоторое время) Асинхронную функцию следует вызывать через setTimeout(). SetTimeout не будет блокировать выполнение скрипта во время ожидания:

function someThingThatTakesAWhile() { 
    for (var i = 0; i < someVeryLargeNumber; i++) { 
     //... 
    }; 
} 
setTimeout(function() { 
    someThingThatTakesAWhile(); 
}, 0); 

(не проверял, что, пожалуйста, простите опечатки, & с)

Но если Вы желаете сделать это в узле, я не» Думаю, это то, чего вы действительно хотите.

+1

Я хочу сделать это в узле –

+0

P.S. Вы сможете «вернуть» значение, которое перестанет существовать. Вам нужно будет вызвать другую функцию (обратный вызов) для обработки результата вашей «асинхронной» функции. –

+0

Тогда, пожалуйста, посмотрите мой комментарий выше на свой вопрос, указав на вопрос о дублировании stackoverflow. –

0

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

Один из способов сделать это, как указано в @ T.J. Ответ Кроудера заключается в том, чтобы поставить вызов вашей функции с помощью process.nextTick, чтобы он работал в следующем цикле цикла событий. Это может помочь разбить интенсивное вычисление на итерации и что каждая итерация будет поставлена ​​в очередь для запуска в следующем цикле цикла событий после последнего. Это может помочь в некоторых случаях, но не всегда вы можете разбивать вычисления на итерации, которые запускают асинхронный переход друг от друга. Если вы ищете более подробное объяснение того, как Javascript работает асинхронно, я предлагаю прочитать this book.

Есть как минимум два других способа (что я знаю) для достижения своего рода параллелизма с Node.js - Рабочие/потоки и дочерние процессы. Редкие процессы - это еще один процесс Node.js, который выполняется вашим основным приложением. Вы можете использовать собственный модуль * child_process * для Node.js для запуска и управления дочерними процессами, если вы хотите пройти этот путь. Посмотрите на official docs для получения дополнительной информации.

Третий способ сделать это - использовать Рабочих очень похоже на то, как веб-работники используются в браузере. Рабочий - это фрагмент кода, который выполняется в другом потоке ОС, чем основное приложение. Мне кажется, что это самый простой способ добиться параллелизма, хотя некоторые утверждают, что это не самый надежный способ сделать это, и что создание дочерних процессов лучше.

Там очень хорошее объяснение того, как работают работники на MDN. Чтобы использовать Рабочих в Node.js, вам понадобится внешний модуль, такой как webworker-threads.

Вот пример кода, созданный из вашего образца с фрагментом из их документации:

var Worker = require('webworker-threads').Worker; 

var worker = new Worker(function(){ 
    onmessage = function(event) { 
     result = sum(event.data.a, event.data.b); 
     result = sum(result, event.data.c); 
     result = sum(result, event.data.d); 
     result = sum(result, event.data.e); 
     result = sum(result, event.data.f); 
     postMessage(result); 
     self.close(); 
    }; 
}); 
worker.onmessage = function(event) { 
    console.log("The result is: " + event.data); 
}; 
worker.postMessage({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}); 

// Do some other stuff that will happen while your Worker runs... 

С учетом всего сказанного, большинство людей стараются избегать запуска параллельного кода в Node.js. Асинхронный характер Javascript позволяет легко писать простой и сжатый код, и обычно вы хотите сохранить его таким образом, не пытаясь ввести параллелизм в ваше приложение, если это не является абсолютно необходимым.

+0

Почему так негативно? :) Я только что описал другой способ параллелизма. Если что-либо из этого неверно или вводит в заблуждение, я буду рад исправить ситуацию. –

Смежные вопросы