ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用setTimeout()的Promise.all()问题,状态未更新

2019-11-08 10:37:40  阅读:479  来源: 互联网

标签:reactjs promise javascript


我有一个箭头函数,该函数从cDM调用以使用setTimeout()每20秒检索一次日程表的更新状态.

componentDidMount() {
    //get request to /schedules
    //update state with response data
    this.getUpdatedStatus();
}

/ schedules中存在的每个时间表如下所示:

"data": {
"id": "2147483605",
"selfUri": "/schedules/2147483605",
"type": "Schedule",
"status": "Pending",
}

因此,在下面的方法中,每个schedule.selfUri被请求,而我试图更新每个日程表的状态.

    getUpdatedStatus = () => {
//fetch updated status,
const schedules = this.state.schedules;
Promise.all(
  schedules.map(schedule =>
    axios({
      method: "get",
      url: schedule.selfUri,
    })
  )
)
  .then(response => {
    console.log(response);
    const isIncomplete = response.some(r => r.status !== "Complete");
    console.log(isIncomplete);
    if (isIncomplete) {
      this.timeout = setTimeout(() => this.getUpdatedStatus(), 20000);
    }
    this.setState(
      {
        scheduleStatus: isIncomplete ? "Pending" : "Complete",
      },
      () => {
        console.log(this.state.scheduleStatus);
        console.log(this.state.schedules);
      }
    );
  })
  .catch(error => console.log(error.response));

};

setTimeout函数正在运行,并且每20秒请求一次以获取状态的可能更新.对象响应最终返回状态为complete,但该值未在我的表中重新呈现.我相信我的诺言链存在问题,使用setTimeout不会在完成时更新this.state.scheduleStatus.我附上了一个codeandbox,可以更好地了解我的问题.

Codesandbox

解决方法:

我认为您的问题与Promise链或使用setTimeout()没有任何关系.我认为这是由于不正确地获取isIncomplete标志的值所致,因此始终将其设置为true.

您通过以下行设置此值:

const isIncomplete = response.some(r => r.status !== "Complete")

我认为这里的问题是您期望响应对象是您指定的数据,其中包含带有字符串值的status属性,而实际上这是Axios返回的响应对象,其中statusproperty是状态实际响应的代码(成功时为200).因此,isIncomplete始终为true,因为r.status从不等于“ Complete”.

您的数据可以在data属性中找到,因此上述行应如下所示:

const isIncomplete = response.some(r => r.data.status !== "Complete")

标签:reactjs,promise,javascript
来源: https://codeday.me/bug/20191108/2007449.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有