【问题标题】:Promise keeps pending and "then" or "catch" are not triggering. ReactJSPromise 一直挂起,“then”或“catch”没有触发。反应JS
【发布时间】:2020-03-12 06:04:00
【问题描述】:

我正在赶上学习 React。如果您对此代码有任何提示,请分享,这对我很重要:)。

为什么这个承诺不起作用?

在控制台中显示待处理状态。

承诺:

_server.get(`/select`, (req, res) => {   
        return DefaultSQL.select(table).then((result) => {           
            return result
        }).catch((err) => {
            console.log(err)
        });      
})

我称之为承诺的地方:

export const getData = (url) => {
  const response =  Server.get(url)       status
    return response.then((result) => {    // <- Not firing  
      return result 
  }).catch((err) => { // <- Not firing too
    console.log(err);
  })    
}

承诺的名称:

class DefaultSQL {
  select(table) {
    const sql = `SELECT * FROM ${table}`;
    return Db.conn.query(sql).then((result) => 
      result
    ).catch((err) => {  
      console.log(err) 
    });
  }
...

编辑:

当我将“return result”更改为“return res.json(result)”时,promise 不会保持挂起状态,但是在我调用 promise 的地方会出现错误,说“response”不是函数

【问题讨论】:

  • 您似乎将服务器端代码与客户端代码混为一谈。服务器上的路由处理函数必须写一个响应,而不是返回一个承诺。
  • 请向我们展示您对Server.get 的实现。这一定是关于response 不是函数的客户端错误的来源。

标签: javascript reactjs ecmascript-6 promise nodes


【解决方案1】:

你应该rethrow the error/throw a new errorcatch error again

这是一个例子:

Promise.reject("throwed on demo 1")
.catch((e) => {
  console.log("Catched", e)
})
.catch((e) => {
  // unreached block
  console.log("Can NOT recatch", e)
})

Promise.reject("throwed on demo 2")
.catch((e) => {
  console.log("Catched", e)
  throw e
})
.catch((e) => {
  console.log("Recatched", e)
})

更新:另一个问题,即使错误/成功,您也需要发送响应。否则,请求将不会响应,客户端将永远挂起。

_server.get(`/select`, (req, res) => {   
        return DefaultSQL.select(table).then((result) => {           
            res.send(result)
            //return result
        }).catch((err) => {
            res.status(500).send(err)
            console.log(err)
        });      
})

【讨论】:

  • 我在哪里拒绝?
  • 不是你。 Db.conn.query(sql) 出错时会拒绝。
  • 我在您的代码中发现了另一个问题。我刚刚更新了帖子。
  • "res" 在 catch 内无法访问。有没有办法在错误中改变状态?
  • "res" 应该在_server.get 范围内可用。在 DefaultSQL 中,请重新抛出错误。
猜你喜欢
  • 2019-01-12
  • 2015-11-08
  • 2017-06-08
  • 2016-10-18
  • 2019-10-04
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
相关资源
最近更新 更多