2014-02-03 3 views
0

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

function findStudentAndCalculate(name, cb); 

Съ обратный вызов, которая принимает в качестве параметров подстраховаться и экземпляр студента. я прошел за Сь

function calculateSomething(err, st){ 
    if(err) throw new Error("Error") 
    var result = some stuff with st; 
    return result; 
} 

Я должен иметь это возвращение к реакции на страницу для данного URL с параметром имя

findStudentAndCalculate("John", calculateSomething); 
+2

У вас нет. Вы используете значение * в * обратном вызове. Функция 'findStudentAndCalculate' должна передавать данные в' cb'. –

+0

@cookiemonster У меня есть эти функции и не могу измениться, и мне нужен результат возврата этой цепочки выполнения. –

+0

Ну, если вы не можете их изменить, вы застряли. Сожалею. –

ответ

0

Ну, вы не предоставили нам достаточно информации для findStudentAndCalculate знать, какие значения для использования для параметров обратного вызова или как вы хотите сохранить или вернуть значение return из обратного вызова, но. , , в целом . , , когда вы передаете функцию как параметр, вы просто обрабатываете функцию так, как если бы она была определена с использованием параметра в качестве имени функции. Таким образом, в вашем случае, в какой-то момент в findStudentAndCalculate, вы бы сделать звонок так:

var someVariable = cb(errValue, stValue); 

. , , или . , ,

return cb(errValue, stValue); 

код будет действовать, как если бы вы прямо называли:

var someVariable = calculateSomething(errValue, stValue); 

. , , или . , ,

return calculateSomething(errValue, stValue); 

(соответственно)

+0

Это предполагает, что 'findStudentAndCalculate()' является синхронным. Хотя это возможно, было бы интересно узнать, почему он получает обратный вызов. –

+0

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

0

Эта модель обратного вызова наиболее часто используется с asynchronous code. Учитывая, что вы отметили свой пост «nodejs» и «обещание», я собираюсь предположить, что findStudentAndCalculate является асинхронным (например, он должен где-то искать студента в базе данных, что требует времени), и поэтому вы не сможете делать что-либо с его возвратным значением напрямую.

Есть две возможностей:

  1. Если findStudentAndCalculate функция асинхронной типичного Node.js стиля (и он уверен выглядит как типичная функция), то он не будет ничего полезного вернуться , Вместо этого вам нужно будет выполнить всю вашу работу внутри функции обратного вызова, которую вы предоставили (то есть внутри, calculateSomething). Другими словами, вам нужно не только calculateSmething, но и calculateSomethingAndThenDoSomethingWithWhatYouCalculated).

  2. Если, с другой стороны, findStudentAndCalculate возвращает promise, вы можете использовать его then метод «сделать что-то, что вы вычисленный». Это позволит вам сохранить код для вычисления отдельно от кода, который использует расчет. EG:

    findStudentAndCalculate(name, calculateSomething).then(function (result) { 
        // do something with result 
    }) 
    

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

    findStudent(name).then(calculateSomething).then(function (result) { 
        // do something with result 
    }) 
    

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

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