Вы можете получить доступ к token
только после завершения request()
и вызова функции callback
. Это связано с тем, что неблокирующая природа файла node.js - когда вы запускаете запрос, код не блокируется, и вы можете получить доступ к его ответу только после его завершения и вызова функции обратного вызова. Следовательно, вы сначала определяете функцию обратного вызова и передаете ее для запроса в качестве аргумента. Если вы хотите получить доступ к токену, вы можете создать другую функцию и вызвать ее внутри функции обратного вызова.
var request = require('request');
var headers = ...
var dataString = ...
var options = ...
function doStuffWithToken(token) {
console.log(token)
}
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
var str = body;
token = str.split('\"')[3];
doStuffWithToken(token);
}
}
request(options, callback);
Вы также можете использовать обещания для лучшего кода:
var request = require('request');
function getToken() {
var headers = ...
var dataString = ...
var options = ...
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) return reject(error)
if (response.statusCode == 200) {
var str = body;
token = str.split('\"')[3];
resolve(token);
}
}
}
}
getToken()
.then((token) => {
// here you can access the token
console.log(token)
})
.catch((error) => {
console.error('unable to retrieve token', error)
})
Здесь мы создаем оболочку вокруг нашего запроса. getToken () возвращает объект обещание , который можно использовать для регистрации двух обработчиков, когда он успешно разрешается и когда он отклоняет и выдает ошибку.
Вы можете использовать getToken () также с ключевым словом await / async
var request = require('request');
function getToken() {
var headers = ...
var dataString = ...
var options = ...
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) return reject(error)
if (response.statusCode == 200) {
var str = body;
token = str.split('\"')[3];
resolve(token);
}
}
}
}
async function main() {
let token = await getToken()
console.log(token)
}
main()
.then(...)
.catch(...)
Дальнейшие чтения:
Не блокировать цикл обработки событий