Возврат ответа API из функции возвращает неопределенный - PullRequest
0 голосов
/ 01 февраля 2020

поэтому у меня есть два js файла file1. js

const { expect } = require("chai");
const { createEnrollment } = require("../utils/file2")
describe('create enrollment', function () {
   it('enroll the user into the system',  async function () {
        var x = createEnrollment(inputParams)
        console.log(x)

    })

File2. js

const fetch = require('node-fetch')
async function createEnrollment(params) {
fetch('URL').then(function (response) {
response.json().then(function (text) {
  var val = text;
  console.log("VALUE " + val.userId)
  return text;
});
module.exports = { createEnrollment }

Но когда я запускаю этот код console.log (x ) не определено и выполняется до завершения createEnrollment. Я сделал функцию asyn c, но возвращаемое значение не определено.

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Fetch - это асинхронная функция, поэтому ее необходимо использовать либо с async / await, либо с цепочкой обещаний.

Пример:

async function callAPI(url) 
{
  let response = await fetch(url);
  let data = await response.json()
  return data;
}
0 голосов
/ 01 февраля 2020

Нет необходимости объявлять функцию как async, если вы не await что-то внутри нее.

Вам нужно дождаться разрешения асинхронных функций. Чтобы сделать это (без async / await), вам нужно иметь доступ к обещанию, чтобы дождаться его разрешения. Итак, вам нужно вернуть обещание в методе createEnrollment:

function createEnrollment(params) {
    // Note the return before the fetch!
    return fetch('URL')
        .then(function(response) {
            return response.json();
        })
        .then(function(text) {
            var val = text;
            console.log("VALUE " + val.userId)
            return text;
        });

Теперь в вашем тесте вы можете дождаться разрешения обещания:

describe('create enrollment', function () {
    it('enroll the user into the system', function () {
        // The return here is intended for the test to wait until the promise is fullfilled.
        return createEnrollment(inputParams).then(function(x) {
            console.log(x);
        });
    });
});

В качестве альтернативы, если вы используете асинхронный / ожидающий синтаксис:

async function createEnrollment(params) {
    const response = await fetch('URL');
    const text = await response.json();
    return text;
}
describe('create enrollment', function () {
    it('enroll the user into the system', async function () {
        const x = await createEnrollment(inputParams);
    });
});
...