如何从函数中获取最终结果数据

How to get final result data from a function

我一直在努力使功能(见下文)正常工作。如果我在我的测试中这样调用这个函数:

 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(data),我确实会得到正确的数据。 所以我只想知道如何获取该数据。因为我稍后需要用它来进行测试。

我打算这样使用它:

const randomCaseId = finalResult[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;
     }
     )
  })}

因为 getFinalData 没有 return 任何东西,而且它是 async 你永远不会得到任何东西,除了调用该函数时解析为 undefined 的承诺.

为什么 getFinalData 被标记为 async,因为您从不使用 await。我会使用 async/await 作为简单代码,而不是您使用的 .then 链

要访问调用该函数的结果,您需要 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();

因为承诺就是这样运作的

这里有几个问题:

  • 当您 return 函数内部的值传递给 then 时,它不会 return 编辑为外部函数的值
  • getFinalData 是一个 async 所以它会 return 一个承诺
  • getFinalData 是 return 承诺,但您永远不会将值作为解析数据传递

您可以使用以下代码,等待响应:

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)
    })

还要确保等待获取和 return 解析值:

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();    
}