返回嵌套承诺但未找到响应

Posted

技术标签:

【中文标题】返回嵌套承诺但未找到响应【英文标题】:Returning nested promise but not finding response 【发布时间】:2020-09-30 04:16:04 【问题描述】:

我在这里阅读了很多问题,但仍然无法找到答案。这可能意味着我问错了问题,但不管怎样。

我正在尝试使用 REST api 后端在 Vue.js 中构建我的第一个应用程序,该后端将使用 JWT 令牌进行身份验证。

我正在构建将在底部使用 axios 发出 ajax 请求的层。

上面的层处理身份验证、JWT 令牌、超时等

然后我进入 Vue 的服务、商店和组件

所以我的问题是我如何构建这些层,以便在身份验证错误时我可以拦截需要登录刷新的 401 返回,将承诺传递回链。

我读到 here 我不应该创建返回新的承诺,而应该返回原来的承诺。

我看到的是 getMails 的返回结果未定义。

这是我的代码:

async function axios()  // emulate axios returning a promise
    return new Promise((resolve, reject) => 
      resolve('return from axios');
    )


// authentication layer. check for 401 and use Promise.reject
async function api() 
    await axios().then( 
      response => 
        // if ( response.status==401 )
        //     Promise.reject(response.status)
        console.log('api then: '+response)
        return Promise.resolve(response+'~return from api');    
      )


// services layer builds query params etc...
async function getMails() 
    return await api();


// vuex store to handle emails
// here just run js
getMails().then( function(response)
    console.log('back from getMails with:'+response);
    //let mails = response;
    //console.log('mails: '+mails);
)

见 JSFiddle:https://jsfiddle.net/chrisby/y6eocrm0/

【问题讨论】:

这是您所期待的 - jsfiddle.net/n4b8hqsc/1 吗? api 函数缺少返回关键字, 非常好 - 谢谢!你想把它作为答案吗? 【参考方案1】:

感谢Raja Jaganathan,我错过了 await axios().then 行的返回,因此完整的工作代码如下。我还更新了上面的 JSFiddle。

async function axios()  // emulate axios returning a promise
    return new Promise((resolve, reject) => 
      resolve('return from axios');
    )


// authentication layer. check for 401 and use Promise.reject
async function api() 
  return axios().then( 
    response => 
      // if ( response.status==401 )
      //     Promise.reject(response.status)
      console.log('api then: '+response)
      return Promise.resolve(response+'~return from api');    
    )


// services layer builds query params etc...
async function getMails() 
  return api();


// vuex store to handle emails
// here just run js
getMails().then( function(response)
  console.log('back from getMails with:'+response);
  let mails = response;
  console.log('mails: '+mails);
)

【讨论】:

以上是关于返回嵌套承诺但未找到响应的主要内容,如果未能解决你的问题,请参考以下文章

承诺已创建,但未从中返回

承诺按顺序运行嵌套承诺并在第一次拒绝时解决

从 Mongoose 承诺返回响应

在承诺回调中发送数组响应,但响应为空白

返回$ http承诺中的完整响应对象

如何编写测试用例来覆盖承诺链中所有嵌套的“then”回调