首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在发布请求后,继续检查是否完成了Node.js

在发布请求后,继续检查是否完成了Node.js
EN

Stack Overflow用户
提问于 2018-09-12 17:42:09
回答 1查看 370关注 0票数 0

我正在用大量的数据发出一个帖子请求,这将需要大约一分钟的时间来完成保存。我为此使用的托管服务将在5秒后超时请求,因此我需要设置这个设置,以定期检查数据保存是否完成,以便进行最终更新。

我正在使用request-promise,并且研究了setTimeoutsetInterval方法。在我最近的尝试中(如下所示),我使用的是setTimeout方法,但我的第二个then几乎立即被调用。我希望它在第一个then阶段挂起,直到它被检查了很多次(这里是24次)或实际完成为止。

我可能有一个完全错误的方法,但我没有找到我想要引用的东西的例子。任何一个很好的例子,或者我出错的地方,我们都会非常感激的。

代码语言:javascript
复制
const request = require('request-promise');

function checkFiles () {
  return request({
    uri: `${process.env.ROOT_URL}/api/v1/get/file-processing`,
    method: 'GET',
    json: true
  })
    .then(res => { return res; })
    .catch(err => { return err; });
}

async function init () {
  const filesPostOptions = {/* request options */};

  await request(filesPostOptions)
    .then(async status => { // THEN #1
      if (status.status === 201) {
        return status;
      }

      let checks = 0;

      const checkIt = function() {
        checks++;
        checkFiles()
          .then(res => {
            if (res.status === 201 || checks > 24) {
              status = res;
              return status;
            } else {
              setTimeout(checkIt, 5000);
            }
          })
          .catch(err => {
            console.error(err);
          });
      };

      checkIt();
    })
    .then(status => { // THEN #2
      if (!status.status) {
        throw Error('Post request timed out.');
      }

      return status;
    })
    .catch(err => {
      err = err.error ? err.error : err;
      console.error(err);
    });
}

post响应将传递带有status属性(状态代码)和message属性的响应。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 20:53:48

您需要通过添加一个"THEN #"来控制Promise中的返回

代码语言:javascript
复制
.then(async status => { // THEN #1
  return new Promise((resolve, reject) => { // <---- prevent an immediate return
    if (status.status === 201) {
      return resolve(status);
    }

    let checks = 0;

    const checkIt = function() {
      checks++;
      checkFiles()
        .then(res => {
          if (res.status === 201 || checks > 24) {
            status = res;
            resolve(status);
          } else {
            setTimeout(checkIt, 1000);
          }
        })
        .catch(err => reject(err));
    };

    checkIt();
  })
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52300780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档