2017-02-06 11 views
-4

Новое в JavaScript, и только что начал читать о Callback and Promise. Я просто не понимаю понятия «ждать», пока не получаю значение из запроса POST/GET.функция вернет значение null из сообщения javascript/get

Конкретнее, почему это не будет работать?

var token = null; 

/
/var options = {headers, form, etc} 
/

function getToken() { 

    request(options) 
     .then(function (parsedBody) { 
      this.token = parsedBody 
     }) 
     .catch(function (err) { 
       console.log('POST-Error') 
    }) 

    return token 
} 

console.log(getToken()) 

Я использую `request-prom 'lib в nodejs. Как я понимаю, когда вызывается запрос, тогда переменная токена будет установлена ​​с момента ее обещания, верно?

+6

Возможный дубликат [Как вернуть ответ от асинхронного звоните] (HTTP: // StackOverflow.com/questions/14220321/how-do-i-return-the-response-from-a-асинхронный вызов) – dNitro

+0

Код не является минимальным рабочим примером, поэтому трудно помочь – ecc

+0

@ dNitro, не уверен, что его больше ajax но, возможно, это то же самое? – ValDaHus

ответ

0

Это сложно, и я не обвиняю вас в том, что вы в замешательстве. Все, кто новичок в Node, похоже, запутались в этом.

Ваша проблема в том, что переменная будет изменена правильно - только пока не будет запущена console.log().

Когда функция возвращает обещание, это означает, что что-то произойдет в будущем - возможно, в одно мгновение, возможно, позже, но еще не в то время, когда эта функция возвращает обещание.

Затем вы можете добавить обработчиков выполнения и отклонения к обещанию - эти обработчики будут вызваны, когда обещание будет фактически разрешено (т. Е. Есть некоторые данные, возвращенные запросом, или есть ошибка).

Итак, вы не можете писать:

console.log(getToken()); 

Что вы можете написать это:

getToken() 
    .then(data => console.log('Data:', data)) 
    .catch(error => console.log('Error:', error)); 

Но только тогда, когда вы на самом деле вернуть обещание от вашей функции:

function getToken() { 
    let promise = request(options); 
    return promise; 
} 

сейчас , вы можете использовать ключевое слово async и сделать что-то вроде этого:

async function getToken() { 
    let data = await request(options); 
    return data; 
} 

но эта функция не возвращается data - она ​​возвращает обещание точно так же, как в предыдущем примере.

Помните одно, что вы не можете вернуть какое-либо значение из своей функции, которая пока недоступна. Вы можете вернуть обещание только в том случае, если хотите вернуть что-то еще до его появления. И каждая асинхронная функция - независимо от того, является ли она async function, функция, которая явно возвращает обещание или функцию, которая выполняет обратный вызов, вернется до того, как будет выполнено асинхронное действие, без блокировки потока.

Для получения более подробной информации см некоторые из этих ответов:

+1

Большое спасибо !!! Это именно то, что мне нужно, чтобы понять концепцию. Отличный пример и спасибо за «ссылки» выше! Еще раз большое спасибо! :) – ValDaHus