2014-01-25 5 views
0

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

function1(){ 
    var obj = function2(); 
    console.log(obj); //"undefined". 
} 

function2(){ 
    //do stuff with DB and get obj 
    console.log(obj); //logs obj. 
    return obj; 
} 

Проблема, которую я наткнулся на то, что OBJ гравюр как неопределенные в func1, в то время как func2 не имеет никаких проблем с ним. Когда я вложил функции друг в друга, это сработало, и я верил, что из-за асинхронного характера nodejs он начал регистрироваться в func1 до того, как func2 был закончен. Неужели я ошибаюсь в своих предположениях?

В чем я могу бороться в приведенном выше примере, как бы я закодировал функции, а не вставлял их друг в друга, поэтому я могу сразу вызвать func2 из нескольких разных функций. Я просмотрел обратные вызовы, но не мог понять примеры, приведенные в различных ответах, с функцией внутри функции.

+0

Это действительно вопрос JavaScript, а не только для nodejs. – OrangeDog

+0

Действительно? Я думал, что только nodejs был асинхронным, а не JS целым. Конечно, я работал только с JS в HTML, может быть, это то, откуда приходит мое замешательство. – Araklaj

+0

AJAX - * Асинхронный * JavaScript и XML – OrangeDog

ответ

0

Вы должны определить функции (т. Е. Обратные вызовы) внутри функций.

1 function function1(){ 
2 function2(function(obj) { 
3  console.log(obj); //logs obj. 
    }); 
    } 

4 function function2(callbackFn){ 
    //do stuff with DB and get obj 
    console.log(obj); //logs obj. 
5 callbackFn(obj); 
    } 

function2 можно вызвать из многих мест сразу, а не только function1.

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


Функции значения, так же как числа, строки и объекты.

Это основное фундаментальное функциональное программирование и, вероятно, то, что вы не поняли. В JavaScript, как и на ряде языков, функции не являются специальными *. Это отличается от языков, таких как C или Java, где функции/методы отличаются от обычных значений, которые вы имеете в своем коде.

2; // Here is a number 
var a = 2; // I can assign it to a variable 
console.log(2); // I can pass it as a function argument 

function() {} // Here is a function 
var a = function() {}; // I can assign it to a variable 
console.log(function() {}); // I can pass it as a function argument 

function jim() {} // This function's name is jim 
var a = jim; // I can assign it to a variable 
console.log(jim); // I can pass it as a function argument 

(function() {})(); // I can call a function without giving it any names 
jim(); // I can call a named function 
a(); // I can call a function via a variable 
jim.call(this, arg1); // Or I can get complicated 

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

  1. Объявите новую функцию под названием function1, который не принимает никаких аргументов
  2. Когда function1 называется, вызовите function2 с одним аргументом, новая безымянная функция, которая принимает obj аргумент
  3. Когда анонимная функция вызывается, называют console.log с значением, переданным для obj
  4. Объявите новую функцию function2, которая принимает один аргумент callbackFn
  5. Вызов значения, переданного для callbackFn с одним аргументом, то obj мы получили откуда-то

Таким образом, порядок декларации 1, 4, 2; и порядок выполнения составляет 2, 5, 3.

* Хорошо, они немного особенные.Их определения: hoisted, вы можете выполнить код, который они представляют, и их объявления создают scope и closures. Но это все вопросы в другой раз.

+0

Привет, спасибо за разработку! Часть, о которой я не понимаю, отправляет функцию (obj) в качестве аргумента при вызове функции2, как она возвращает значение функции1 (строка callbackFn (obj)). Я не могу понять логику того, что там происходит. – Araklaj

+0

Он не возвращает значение функции1, он выполняет функцию, заданную как аргумент функции2. function1 просто не может знать, когда будет вызван callbackFn. Он называется Continuation Passing, он в основном похож на Async GOTO. – mpm

+0

Большое спасибо за то, что нашли время, чтобы разбить его OrangeDog. Я думаю, что я понял, что строка 2 передает безымянную функцию функции2, которую выполняет функция2 после выполнения основной задачи получения obj. Это была путаница для меня, спасибо! – Araklaj

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