2017-01-19 5 views
-2

Здравствуйте, прежде чем вы укажете этот вопрос как дубликат, пожалуйста, прочитайте его, я не могу найти пример, который я лично понимаю по моей конкретной проблеме.Краткий пример, необходимый для асинхронной функции JS/nodeJS return

здесь функция псевдо-код:

foo(a1,a2,a3){ 
    //do some logic here 
    return data 
    //lets say the data = 15 
    } 

foo2(){ 
    //do some stuff 
    data = foo(a1,a2,a3) 
    console.log(data) 
    } 

И, как вы, наверное, знаете, данные, напечатанные не определен, а не 15, как я хочу. Может кто-то, пожалуйста, просто дайте мне пример для этого сценария. Я пытался понять это часами. Мне не нужно долго объяснять.

+1

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

+0

Я угадываю, что вы спрашиваете что-то вроде этого: https://jsfiddle.net/rq936qtn/ – yBrodsky

+0

@yBrodsky Я видел это раньше, где я ставил свои параметры ??? – recurf

ответ

0

Это работает для меня:

foo = function(a1,a2,a3) { 
    //do some logic here 
    var data = a1 + a2 + a3; 
    return data; 
    //lets say the data = 15 
    } 

foo2 = function() { 
    //do some stuff 
    var data2 = foo(5,5,5); 
    console.log(data2); 
    return data2 
    } 

foo2(); 

Он регистрирует 15 к консоли, а также возвращение 15 ...

Никто не уверен, что именно у вас проблем, так как ваш псевдокод немного расплывчато, но я думаю, вам будет полезно прочитать о подъеме здесь - https://www.interviewcake.com/question/python/js-scope. Я не собираюсь копировать вставить ответ с веб-сайта, потому что он там лучше отформатирован. :)

0

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

foo(a1,a2,a3){ 
 
    //do some *async* logic here 
 
    regressionFunction(a1, a2, a3, function(result) { 
 
    data = result; 
 
    }); 
 
    
 
    return data; 
 
    //lets say the data = 15 
 
} 
 

 
foo2(){ 
 
    //do some stuff 
 
    data = foo(a1,a2,a3) 
 
    console.log(data) 
 
}

Это приведет к data быть undefined в foo2, потому что data еще не был задан, когда foo возвращается. Следовательно, async.

Существует несколько способов борьбы с этим, но самым простым на данный момент является использование Promise. Подумайте о Promise как заполнитель для гарантированного будущего значения, которое мы затем можем проинструктировать наш код ждать до того, как продолжить.

Вместо того, чтобы просто возвращение data в foo, возвращает Promise разрешить, когда data готов:

foo = function(a1,a2,a3) { 
 
    return new Promise(function(resolve, reject) { 
 
    regressionFunction(a1, a2, a3, function(result) { 
 
     resolve(result); 
 
    }); 
 
    }); 
 
}

И тогда вместо того, чтобы ожидать результата foo быть немедленно доступны в foo2 , мы используем метод Promise экземпляра then.

foo2 = function() { 
 
    //do some stuff 
 
    var data2 = foo(5,5,5); 
 
    data2.then(function(result) { 
 
    console.log('Finally got a result!', result); 
 
    }); 
 
}

Если вам необходимо вернуть значение из foo2 зависимости от результата foo, конечно, вам нужно будет возвращать Promise там.Удобно, тип возврата метода .then само по себе является Promise так что мы можем просто вернуть его:

foo2 = function() { 
    //do some stuff 
    var data2 = foo(5,5,5); 
    return data2.then(function(result) { 
    console.log('Any function receiving this as input can access the result now by accessing the `.then` method of this function'); 
    return result; 
    }); 
} 

Это упрощение Promises, но вы должны получить работу.

+0

, кстати, я не проголосовал за него, сейчас читаю – recurf

+0

Я реализовал это точно, и теперь он просто игнорирует бит внутри функции Promise. Этот синтаксис - это просто ужасный бог, действительно заставляющий меня сумасшедший лол. – recurf

+0

Попробуйте добавить несколько консольных протоколов, чтобы точно определить, где они разваливаются, и проверить внутреннюю подпись функции, чтобы гарантировать, что ваш обратный вызов будет соблюден. Также зацепите функцию catch на 'then' в foo2, например,' data2.then (...). Catch (function (err) {console.log («Ошибка возвращена из обещания», err)}) ' –

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