Почему функция не синхронизируется?

Пишу небольшой сокет клиент, но почему, используя 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 шт):

Автор решения: Oliver Patterson

Ваш код возвращал результат из 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
};

→ Ссылка