Разве область переменных не ограничена только внутри функции .then ()?
Да, к аргументам функции можно получить доступ только внутри самой функции.Однако вы можете присвоить этот аргумент глобальной переменной, к которой можно получить доступ в других функциях:
let result; // global variable
app.get("/location1", function(req, res){
async_function().then(res => {
result = res.toString(); // assign to global
}).catch(/*...*/);
});
Теперь эта глобальная переменная является общей для всех экземпляров .Это означает, что если один пользователь запрашивает location1, результат назначается для redult, а другой пользователь, запрашивающий location2, получает это.Чтобы решить эту проблему, вы должны сохранить результат, относящийся к некоторому токену пользователя, а затем пользователь может передать токен, чтобы получить свой результат:
const results = {};
// Loads the data into the results object
async function loadData(token) {
const result = await async_function();
results[token] = result;
}
app.get("load", (req, res) => {
// Generate unique token:
require('crypto').randomBytes(48, function(err, buffer) {
var token = buffer.toString('hex');
// Load data (fire & forget)
loadData(token);
// And respond with the token:
res.json({ token });
});
});
app.get("result/:token", (req, res) => {
const { token } = req.params;
if(results[token) {
res.send( results[token] );
} else {
res.status(404).end("Not found :(");
}
});
Затем вы можете запросить /load
и получить токен обратно.Например, 1234
, вы можете опросить result/1234
и дождаться появления результата.