如何从函数中获取最终结果数据
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();
}
我一直在努力使功能(见下文)正常工作。如果我在我的测试中这样调用这个函数:
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();
}