如何解决 NodeJs 中的嵌套承诺?
How to resolve nested promise in NodeJs?
我正在使用 node-fetch 模块进行 API 调用。我有一个函数可以进行所有 API 调用。从这个函数中,我正在 returning 状态代码和响应主体。以下代码导致正文为空 -
function makeRequest (url,config) {
return fetch(url,config)
.then( (response) => {
return {
"status" : response.status,
"payload": response.text()
}
})
.catch( (error)=> {
console.log(error)
return {
"status": null,
"payload" : error.message
}
})
}
async function getDestinationToken() {
const config = {
method : "POST",
headers: {
'Authorization': 'Basic ' + Buffer.from(sDestCredentials).toString('base64')
},
body : data
}
const url = uaa_service.credentials.url
console.log('Getting access Token')
let response = await makeRequest(url,config)
console.log("Response from token "+ response)
}
getDestinationToken()
据我了解,response.text() return是一个承诺。在 getDestinationToken() 中,我正在等待它完成。那么,为什么它不起作用?它而是打印一个空体,如下所示 -
{
"status" : 200,
"payload": {}
}
但是,如果我不 return 来自函数的对象,如下所示,代码似乎可以工作。
function makeRequest (url,config) {
return fetch(url,config)
.then( (response) => {
return response.text()
})
.catch( (error)=> {
console.log(error)
return {
"status": null,
"payload" : error.message
}
})
}
在上述情况下,我能够看到响应负载。但是,我不能使用上述方法,因为我在调用函数中也需要 response.status 。
如何解决这个嵌套的承诺?
因为 response.text()
returns 一个承诺,你必须等待它解析为文本,然后再发回响应,否则它只会发回一个未解决的承诺作为 payload
.
return fetch(url,config)
.then((response) => {
return response.text().then(text => {
return {
status: response.status,
payload: text
}
})
})
作为response.text() return承诺
使用 async/await
return fetch(url,config)
.then( async (response) => {
return {
"status" : response.status,
"payload": await response.text()
}
})
您可以混合使用 async/await
和 .then
,但不推荐这样做,因为
纯粹async/await
async function makeRequest (url,config) {
try{
const response= await fetch(url,config)
return{
"status" : response.status,
"payload": await response.text()
}
}
catch(error) {
console.log(error)
return {
"status": null,
"payload" : error.message
}
}
}
我正在使用 node-fetch 模块进行 API 调用。我有一个函数可以进行所有 API 调用。从这个函数中,我正在 returning 状态代码和响应主体。以下代码导致正文为空 -
function makeRequest (url,config) {
return fetch(url,config)
.then( (response) => {
return {
"status" : response.status,
"payload": response.text()
}
})
.catch( (error)=> {
console.log(error)
return {
"status": null,
"payload" : error.message
}
})
}
async function getDestinationToken() {
const config = {
method : "POST",
headers: {
'Authorization': 'Basic ' + Buffer.from(sDestCredentials).toString('base64')
},
body : data
}
const url = uaa_service.credentials.url
console.log('Getting access Token')
let response = await makeRequest(url,config)
console.log("Response from token "+ response)
}
getDestinationToken()
据我了解,response.text() return是一个承诺。在 getDestinationToken() 中,我正在等待它完成。那么,为什么它不起作用?它而是打印一个空体,如下所示 -
{
"status" : 200,
"payload": {}
}
但是,如果我不 return 来自函数的对象,如下所示,代码似乎可以工作。
function makeRequest (url,config) {
return fetch(url,config)
.then( (response) => {
return response.text()
})
.catch( (error)=> {
console.log(error)
return {
"status": null,
"payload" : error.message
}
})
}
在上述情况下,我能够看到响应负载。但是,我不能使用上述方法,因为我在调用函数中也需要 response.status 。
如何解决这个嵌套的承诺?
因为 response.text()
returns 一个承诺,你必须等待它解析为文本,然后再发回响应,否则它只会发回一个未解决的承诺作为 payload
.
return fetch(url,config)
.then((response) => {
return response.text().then(text => {
return {
status: response.status,
payload: text
}
})
})
作为response.text() return承诺
使用 async/await
return fetch(url,config)
.then( async (response) => {
return {
"status" : response.status,
"payload": await response.text()
}
})
您可以混合使用 async/await
和 .then
,但不推荐这样做,因为
纯粹async/await
async function makeRequest (url,config) {
try{
const response= await fetch(url,config)
return{
"status" : response.status,
"payload": await response.text()
}
}
catch(error) {
console.log(error)
return {
"status": null,
"payload" : error.message
}
}
}