Почему функция не синхронизируется?
Пишу небольшой сокет клиент, но почему, используя await все равно не получается всё синхронизировать. Условно событие client.on не хочет ожидать выполнение функция same_articles() и мгновенно отправляет обратно серверу строку из нулевого символа.
const fs = require("fs");
const { resourceLimits } = require("worker_threads");
var req72 = require('./request72');
var req71 = require('./request71');
var str = fs.readFileSync('resourse/Preference.txt', 'utf8');
var IP = str.split('\n')[6].substr(17);
var PORT = str.split('\n')[7].substr(19);
IP = IP.replace(/"/g, '');
IP = IP.replace(/\r/g, '');
PORT = PORT.replace(/"/g, '');
PORT = PORT.replace(/\r/g, '');
const Net = require('net');
const client = new Net.Socket();
client.connect({ port: PORT, host: IP }, function(socket) {
//smth
});
client.on('data', async function(input) {
var answer;
if(input.indexOf('72') + 1) {
answer = await req72.same_articles (input.toString());
}
else if(input.indexOf('71') + 1) {
answer = await req71.same_articles (input.toString());
}
answer += '\0';
client.write(answer, 'utf8');
});
Как человеку, пишущему приоритетно на C++, очень тяжело понять как здесь что и почему...
Если есть более действенный метод, который позволит синхронизовать функцию same_articles() с событием client.on, то я бы очень хотел узнать какой.
Функция same_articles() в одном из файлов:
const { resourceLimits } = require("worker_threads");
async function same_articles(input_string, ans) {
var result = '';
var request = input_string.replace(/71{/g, '');
request = request.replace(/}/g, '');
const api_resource = 'https://api.elsevier.com/content/search/scopus?';
const search_param = 'query=AU-ID(' + request + ')&sort=citedby-count';
apiKey = 'тут был api ключ, просто стёр его';
var XMLHttpRequest = require('xhr2');
var xhr = new XMLHttpRequest();
xhr.open('GET', api_resource + search_param);
xhr.setRequestHeader('X-ELS-APIKey', apiKey);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-ELS-ResourceVersion', 'XOCS');
xhr.send();
xhr.onload = () => {
if(xhr.status != 200 || JSON.parse(xhr.response)['search-results'].entry[0]['error'] == 'Result set was empty') {
result += 'NOOK71:BadID{}';
}
else {
let i = 0;
result = 'OK71{';
while (i < JSON.parse(xhr.response)['search-results'].entry.length) {
data1 = JSON.parse(xhr.response)['search-results'].entry[i]['dc:title'];
data2 = JSON.parse(xhr.response)['search-results'].entry[i].link[2]['@href'];
result += JSON.stringify(data1, null, 4) + "`" + JSON.stringify(data2, null, 4) + "~";
i++;
}
result = result.substring(0, result.length - 1);
result += '}';
result = result.replace(/"/g, '');
return result;
}
};
}
module.exports = {
same_articles: same_articles
};
UPD: на return смысла смотреть нет, реализован он был у меня неверно. Описанные симптомы вопроса относились к объекту, который я передавал в функцию по ссылке. И именно для такого результата получался запоздалый ответ.
Ответы (1 шт):
Ваш код возвращал результат из callback функции вызываемой xhr.onload в никуда. Когда же мы завернули все это в промис, уже промис ждет, пока внутри вернут что-то через resolve, либо reject.
const { resourceLimits } = require("worker_threads");
async function same_articles(input_string, ans) {
var result = '';
var request = input_string.replace(/71{/g, '');
request = request.replace(/}/g, '');
const api_resource = 'https://api.elsevier.com/content/search/scopus?';
const search_param = 'query=AU-ID(' + request + ')&sort=citedby-count';
apiKey = 'тут был api ключ, просто стёр его';
var XMLHttpRequest = require('xhr2');
const promiseResult = new Promise((resolve, reject) =>
{
var xhr = new XMLHttpRequest();
xhr.open('GET', api_resource + search_param);
xhr.setRequestHeader('X-ELS-APIKey', apiKey);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-ELS-ResourceVersion', 'XOCS');
xhr.send();
xhr.onerror = () => {
reject('Произошла ошибка при запросе');
};
xhr.onload = () => {
const response = JSON.parse(xhr.response);
if(xhr.status != 200 || response['search-results'].entry[0]['error'] == 'Result set was empty') {
result += 'NOOK71:BadID{}';
}
else {
let i = 0;
result = 'OK71{';
while (i < response['search-results'].entry.length) {
data1 = response['search-results'].entry[i]['dc:title'];
data2 = response['search-results'].entry[i].link[2]['@href'];
result += JSON.stringify(data1, null, 4) + "`" + JSON.stringify(data2, null, 4) + "~";
i++;
}
result = result.substring(0, result.length - 1);
result += '}';
result = result.replace(/"/g, '');
}
resolve(result);
};
});
return await promiseResult;
}
module.exports = {
same_articles: same_articles
};