执行顺序请求以处理每个请求

时间:2019-01-31 13:10:36

标签: javascript arrays angularjs recursion

我需要按顺序发送请求,但是当一个返回错误时停止发送请求,我使用的是来自angular的$ http提供程序。

我的代码是这样的:

PushStreamResult

我的问题是:有更好的方法来完成这项工作吗?

3 个答案:

答案 0 :(得分:0)

这是与您的代码非常相似的代码,但是没有处理或添加索引号,因此它更加清晰。

const queue = [
  { url: '/api/test/1' },
  { url: '/api/test/2' },
  { url: '/api/test/3' },
  { url: '/api/test/4' },
];

function runQueue() {
  const req = queue[0];

  $http({method: 'get', url: req.url})
  .success(response => {
    console.log(response);
    queue.shift();
    if (queue.length > 0) {
     runQueue();
    }
  })
  .error(err => {
    console.error(err);
  })
}

使用蓝鸟承诺解决方案。

另一个不错的选择是使用bluebird Promise库(特别是如果您的代码是服务器端nodejs)。 如今,该库不是很流行,因为Promises在几乎所有地方都得到本地支持。但是仍然有些方法非常有用。如果您认为Promise.each method可以正常工作。

const Promise = require('bluebird'); // or import * as Promise from 'bluebird';
const queue = [
      { url: '/api/test/1' },
      { url: '/api/test/2' },
      { url: '/api/test/3' },
      { url: '/api/test/4' },
    ];

Promise.each(queue, (req) => {
    return http$({method: 'get', url: req.url}).then((resp) => {
            console.log(resp);
        });
}).then(() => {
    console.log("done");
}).catch(err => {
   console.error(err);
})

答案 1 :(得分:0)

您需要的是Promise链和递归。

const steps = [
    { url: '/api/test/1' },
    { url: '/api/test/2' },
    { url: '/api/test/3' },
    { url: '/api/test/4' },
]

const executeStep = index => {
    // Validate step existence
    if (typeof steps[index] == 'undefined') return true;
    // Request
    return $http({method: 'get', url: steps[index].url})
    .then(response => {
        if (!response.success) throw response
        return executeStep(index+1)
    })
}

executeStep(0)
  .then( () => console.log('all done'))
  .catch(e => console.error('something failed', e))

在这里,每当一个请求完成时,它都会返回一个包含下一个请求的新承诺。这样,executeStep(0)仅在所有其他承诺都已完成时才能解决,或者如果任何承诺遇到错误,它将立即被拒绝。

答案 2 :(得分:-1)

您可以将异步功能与诺言结合使用。

const queue = [
  { url: '/api/test/1' },
  { url: '/api/test/2' },
  { url: '/api/test/3' },
  { url: '/api/test/4' },
];

function oneRequest(req) {
    return new Promise((resolve,reject)=>{
        $http({method: 'get', url: req.url})
            .success(response => resolve(response))
            .error(err => reject(err));
    });
}

async function allRequests(reqs) {
    let resps = [];
    for(var i=0;i<reqs.length;i++) {
        let resp = await oneRequest(reqs[i]);
        resps.push(resp);
    }
    return resps;
}

allRequests(queue)
    .then(resps => console.log(resps))
    .catch(err => console.log(err));
相关问题