我需要按顺序发送请求,但是当一个返回错误时停止发送请求,我使用的是来自angular的$ http提供程序。
我的代码是这样的:
PushStreamResult
我的问题是:有更好的方法来完成这项工作吗?
答案 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));