2015-07-01 4 views
0

Скажем, у меня есть эта функция:Javascript возвращаемое значение из вложенных функций

rest = require('restler'); 

function authenticate(credentials) { 
    var accessToken; 

    rest.post(BaseURL + '/Users/login', { data : credentials }) 
     .on('complete', function(result, response) { 
       console.log(result.id); // this works fine 
       accessToken = result.id; 
     }); 

    return accessToken; 
}; 

Я хочу, чтобы возвращать string содержащий accessToken , когда я запускаю это:

var at = authenticate({ "username": "test", "password" : "test" }); 
console.log('Access Token:', at); 

Я получаю Access Token : underfined

+1

Функция сообщения is async. Оператор 'return accessToken;' не дожидается, пока не будет выполнен асинхронный вызов. Таким образом, он возвращает то, что начальное значение accessToken в этот момент. – 3abqari

+1

Вы не можете этого сделать. Когда функция 'authenticate' вернется, обратный вызов еще не выполнен, и он не будет, пока сервер не ответит. Я уверен, что кто-то сможет указать вам некоторые ресурсы здесь, но тем временем попробуйте найти некоторую документацию по асинхронным вызовам и работать с Promises. – spectras

ответ

4

стандарт, принятый способ, должен был бы изменить authenticate функцию:

function authenticate(credentials, cb) { 
    rest.post(BaseURL + '/Users/login', { data : credentials }) 
     .on('complete', function(result, response) { 
       console.log(result.id); // this works fine 
       if (cb) { cb(result.id); } 
      } 
     }); 
}; 

, а затем выполнить его так:

authenticate({ "username": "test", "password" : "test" }, function(at) { 
    console.log(at); 
}); 

асинхронные вызовы должны быть обработаны либо обратный вызов или его обещаю. Обещания «хороши», но не более чем обратные вызовы. Вот почему вы видите почти каждый API-интерфейс Node, использующий обратные вызовы.

0

У вас есть } запасные части в полной функции:

rest.post(BaseURL + '/Users/login', { 
    data: credentials 
}) 
    .on('complete', function (result, response) { 
    console.log(result.id); // this works fine 
    accessToken = result.id; 
}); // `}` spare here 

Надеюсь, что эта помощь.

+0

Это была только опечатка, все еще не работает. – zianwar

+0

Спасибо, решение было использовать обратный вызов. – zianwar

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