Проблема с получением Javascript / ax ios обратных вызовов - PullRequest
0 голосов
/ 18 марта 2020

Я относительно новичок в JavaScript и, похоже, у меня возникли проблемы с работой функций обратного вызова «успех / ошибка» при использовании Ax ios.

Например, запустив следующий тестовый код интеграции с помощью jest (npm тестовая команда), я получаю вывод, приведенный ниже. Мне интересно, почему сообщение «my-ping-2 success». или «ошибка my-ping-3: ...» не выводится на консоль. Я пытаюсь убедиться, что вызывающая сторона внутренних функций может при желании передать функции обратного вызова для ситуаций успеха и ошибок. Что я делаю неправильно? Заранее спасибо!

Подробности: Я знаю, что локальный сервер API работает нормально, он возвращает HTTP-статус 200, если я посещаю URL http://localhost: 9090 / api / v1 / ping и тесты через почтальона. Ниже приведен полный исходный код, который может воспроизвести проблему на моем компьютере (MacOS, nodejs версия v12.16.1, npm версия 6.13.4).

Я использую метод generi c ax ios (config) во внутренней функции, потому что я использую ту же внутреннюю функцию для вызовов HTTP get / post. Я надеюсь, что все в порядке.

вывод консоли jest

 PASS  src/__tests__/01_my.test.js
  ● Console

    console.log src/__tests__/01_my.test.js:14
      my-ping-1...
    console.log src/__tests__/01_my.test.js:20
      my-ping-4 done.

Исходный код для воспроизведения проблемы

import axios from "axios";
import { isEmpty, merge } from 'lodash';

const baseURL = 'http://localhost:9090/api/v1/';
const headers = {
    Accept: 'application/json',
};
const source = axios.CancelToken.source();


test('Test my-appcode', done => {

    console.log('my-ping-1...');
    fw_get_1('/ping',  function(response) {
        console.log('my-ping-2 success.');
    }, function(error) {
        console.log('my-ping-3 error: ' + fw_jsonFormatter(error));
    } );
    console.log('my-ping-4 done.');

    done();
});

function fw_get_1(url, successCallback = null,
                       errorCallback = null) {
    return fw_get_2(url, {}, successCallback, errorCallback);
}

function fw_get_2(url, configs = {},
                                successCallback = null,
                                errorCallback = null) {
    url = encodeURI(url);
    return fw_request_3('get', url, configs, successCallback, errorCallback);
}

function fw_request_3(method, url, configs = {},
                             successCallback = null,
                             errorCallback = null) {

    let inputCfgs = {
        params: configs.params,
        data : configs.data,
        headers : configs.headers
    };

    const axiosOptions = merge(
        {},
        {
            method,
            url,
            baseURL,
            headers,
            cancelToken: source.token
        },
        inputCfgs
    );

    return axios(axiosOptions).then( function(response) {
        if (successCallback) {
            console.log('fw_request_internal success-1 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
            successCallback(response);
        } else {
            console.log('fw_request_internal success-2 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
        }
    }).catch(function (error) {
        if (errorCallback) {
            console.log('Calling input errorCallback method: ' + axiosOptions.method + ' url: ' + axiosOptions.url +  fw_jsonFormatter(error));
            errorCallback(error);
        } else {
            console.log('fw_request_internal error-2 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
            console.log(fw_jsonFormatter(error));
        }
    });
}

function fw_jsonFormatter(obj) {
    return JSON.stringify(obj, null, 1);
}

1 Ответ

0 голосов
/ 18 марта 2020

Для тех, кто видел подобную проблему, похоже, что проблема заключалась в том, что тестовый жгут завершил работу до того, как могли быть вызваны обратные вызовы. Я добавил ожидание на несколько секунд в конце теста, чтобы подтвердить, и теперь я могу видеть все журналы консоли, как и ожидалось. Смотрите пересмотренный код ниже. Я пишу некоторые JS функции-оболочки вокруг REST API. Просто хочу убедиться, что пользователи функций-оболочек могут по желанию переопределять функции обратного вызова Пожалуйста, дайте мне знать, если есть лучший способ сделать это. Спасибо !!

Новый журнал консоли

 PASS  src/__tests__/01_my.test.js (5.722s)
  ● Console

    console.log src/__tests__/01_my.test.js:14
      my-ping-1...
    console.log src/__tests__/01_my.test.js:20
      my-ping-4 done.
    console.log src/__tests__/01_my.test.js:61
      fw_request_internal success-1 method: get url: /ping
    console.log src/__tests__/01_my.test.js:16
      my-ping-2 success.
    console.log src/__tests__/01_my.test.js:83
      Waited 4 seconds
    console.log src/__tests__/01_my.test.js:84
      Finished test wait

Исправлен исходный код с ожиданием в конце тестов.


import axios from "axios";
import {merge } from 'lodash';

const baseURL = 'http://localhost:9090/api/v1/';
const headers = {
    Accept: 'application/json',
};
const source = axios.CancelToken.source();


test('Test my-appcode', done => {

    console.log('my-ping-1...');
    fw_get_1('/ping',  function(response) {
        console.log('my-ping-2 success.');
    }, function(error) {
        console.log('my-ping-3 error: ' + fw_jsonFormatter(error));
    } );
    console.log('my-ping-4 done.');

    fw_test_end_wait(done, 'Finished test wait', 4 );
});

function fw_get_1(url, successCallback = null,
                       errorCallback = null) {
    return fw_get_2(url, {}, successCallback, errorCallback);
}

function fw_get_2(url, configs = {},
                                successCallback = null,
                                errorCallback = null) {
    url = encodeURI(url);
    return fw_request_3('get', url, configs, successCallback, errorCallback);
}

function fw_request_3(method, url, configs = {},
                             successCallback = null,
                             errorCallback = null) {

    let inputCfgs = {
        params: configs.params,
        data : configs.data,
        headers : configs.headers
    };

    const axiosOptions = merge(
        {},
        {
            method,
            url,
            baseURL,
            headers,
            cancelToken: source.token
        },
        inputCfgs
    );

    return axios(axiosOptions).then( function(response) {
        if (successCallback) {
            console.log('fw_request_internal success-1 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
            successCallback(response);
        } else {
            console.log('fw_request_internal success-2 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
        }
    }).catch(function (error) {
        if (errorCallback) {
            console.log('Calling input errorCallback method: ' + axiosOptions.method + ' url: ' + axiosOptions.url +  fw_jsonFormatter(error));
            errorCallback(error);
        } else {
            console.log('fw_request_internal error-2 method: ' + axiosOptions.method + ' url: ' + axiosOptions.url);
            console.log(fw_jsonFormatter(error));
        }
    });
}

function fw_jsonFormatter(obj) {
    return JSON.stringify(obj, null, 1);
}

function fw_test_end_wait(done, msg, waitSecs) {
    setTimeout(() => {
        console.log('Waited ' + waitSecs + ' seconds');
        console.log(msg);
        done();}, waitSecs * 1000);
}

...