Как получить данные конечного результата из функции

#javascript #function #testing #automated-tests #testcafe

Вопрос:

Я пытался заставить функцию(см. Ниже) работать. Если я вызову эту функцию в своем тесте следующим образом:

  test.meta({ CID: 'C67', type: TestType.Critical }).timeouts({
    pageLoadTimeout: 5000,})(
    'Test to GetData',
    async (t:TestController) => {
      // When
const result  = getData.getFinalData()
const finalResult = JSON.stringify(result)
console.log(finalResult)
  })
 

В журнале я получаю пустой результат:
Раскрытие дела
{}

Но если я сделаю console.log(данные) внутри функции, я получу правильные данные. Поэтому я просто хочу знать, как получить эти данные. Как мне понадобится позже, чтобы использовать его для моего теста.

Я собирался использовать его вот так:

const randomCaseId = конечный результат[getRandomInt(1000)].CaseID.toString()

 public async getFinalData () {

    fetch(TOKEN_API, {
      method: 'post',
      body: new URLSearchParams(details),
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
   })
   .then((res: { json: () => any; }) => res.json())
   .then((json: any) => { 
    const token = (json.accessToken.toString())
    console.log(token),
    fetch(DATA_API, {
       method: 'GET',
       headers: { 'Content-Type': 'application/json' ,'authorization': `Bearer ${token}`}})
     .then((res: { json: () => any; }) => res.json())
     .then((json:any)=>{
       const data =  JSON.stringify(json)
       return data;
     }
     )
  })}
 

Комментарии:

1. почему вы строчите это data ? JSON гораздо менее полезен, чем объект. А затем вы пытаетесь упорядочить JSON, который, как вы предполагаете, будет возвращен. Не уверен, что вы понимаете JSON …

2. так getFinalData как ничего не возвращает, и async вы никогда не получите ничего, кроме обещания, которое будет выполнено undefined при вызове этой функции. 1. Почему getFinalData помечено async , так как вы никогда не используете await . 2. чтобы получить доступ к результату вызова функции, вам потребуется либо await она, либо использовать .then результат

3. используйте const result = await getData.getFinalData() в async (t:TestController) => { — но убедитесь getFinalData , что на самом деле возвращает то, что вам нужно

Ответ №1:

так getFinalData как ничего не возвращает, и async вы никогда не получите ничего, кроме обещания, которое будет выполнено undefined при вызове этой функции.

Почему getFinalData помечено async , так как вы никогда не используете await . Я бы использовал async/await для простого кода, а не для .затем цепочку, которую вы используете

Чтобы получить доступ к результату вызова этой функции, вам потребуется либо await использовать ее, либо использовать .then результат — поскольку функция вызова является async , используйте await

Перепишите свой код, как

 test.meta({ CID: 'C67', type: TestType.Critical })
.timeouts({pageLoadTimeout: 5000,})('Test to GetData', async (t:TestController) => {
    // When
    const finalResult  = await getData.getFinalData();
    console.log(finalResult)
})
 

и

 public async getFinalData () {
    const tokenres = await fetch(TOKEN_API, {
        method: 'post',
        body: new URLSearchParams(details),
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    });
    const tokendata = await tokenres.json();
    const token = tokendata.accessToken.toString();
    console.log(token);
    const res = await fetch(DATA_API, {
            method: 'GET',
            headers: { 'Content-Type': 'application/json' ,'authorization': `Bearer ${token}`}
        });
    // ** see note below, don't do the next two lines like this
    const data = await res.json();
    return data;
}
 

Этот код правильно использует async/await и не строит данные в JSON дважды!

Кроме того, обратите внимание

 const data = await res.json();
return data;
 

может быть одна строка

 return res.json();
 

Потому что именно так работают обещания

Ответ №2:

Здесь есть несколько проблем:

  • Когда вы возвращаете значение внутри функции , которое вы передали then , оно не будет возвращено как значение внешней функции
  • getFinalData это async так, чтобы вернуть обещание
  • getFinalData возвращает обещание, но вы никогда не передаете значение в качестве разрешенных данных

Вы можете использовать следующий код, который будет ждать ответа:

 test.meta({
    CID: 'C67',
    type: TestType.Critical
}).timeouts({
    pageLoadTimeout: 5000,
})(
    'Test to GetData',
    async (t: TestController) => {
        // When
        const result = await getData.getFinalData()
        const finalResult = JSON.stringify(result)
        console.log(finalResult)
    })
 

А также обязательно дождитесь выборки и верните разрешенное значение:

 public async getFinalData() {
    const res = await fetch(TOKEN_API, {
            method: 'post',
            body: new URLSearchParams(details),
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
        })
    const json = await res.json();
    const token = (json.accessToken.toString())
    console.log(token);
    const response = await fetch(DATA_API, {
                    method: 'GET',
                    headers: {
                        'Content-Type': 'application/json',
                        'authorization': `Bearer ${token}`
                    }
                });
    return response.json();    
}
 

Комментарии:

1. честно говоря, я не думаю, что какой-либо из JSON.stringify требуется … с помощью этого кода, если бы результатом был ОБЪЕКТ {hello: "world"} , то конечным результатом был бы результат … подождите этого "{\"hello\":\"world\"}" — даже если первоначальный результат был жалом world , конечный результат будет "\"world\""

2. @Браво верно, я совсем забыл об этом! Обновленный

3. ещё один… return await response.json(); может быть return response.json(); , из-за того, как работают обещания

4. @Браво, я знаю, но так немного чище!

5. Ребята, большое вам спасибо за помощь. Пожалуйста, поймите, что я не разработчик, а только учусь. Я инженер по автоматизации, который просто пытается автоматизировать наше веб-приложение.