我有一个要向其发出Web请求的网址数组。我想用Promise异步调用Web请求,并继续完成的Promise链。现在我在做
.then((lines) => {
var tasks = [];
lines.forEach((line) => {
tasks.push(() => { return rp(BASE_URL + line); });
});
return Promise.map(tasks, (job) => { return job(); }, { concurrency: 5 });
})
.then((info) => {
inspect('info: ' + info);
})
但是,这样做的问题是,它在调用下一个任务之前等待所有任务完成 .then()
我想知道是否可以为已解决的任何任务调用.then()并继续执行链?
我猜我可以做这样的事情:
.then((lines) => {
lines.forEach((line) => {
rp(BASE_URL + line)
.then((info) => {
inspect(info);
});
});
})
.then((a) => {
// all requests have been made
})
当我嵌套我的.then()时,这开始像回调地狱,在其他遇到相同问题的其他情况下,可能需要这样做。
我正在寻找的是这样的:
.then((lines) => {
lines.forEach((line) => {
yield return rp(BASE_URL + line);
});
})
.then((info) => {
// will call inspect on each yield
inspect('info: ' + info);
})
我有一个要向其发出Web请求的网址数组。我想用Promise异步调用Web请求,并继续完成的Promise链。
您将如何在同步代码中执行此操作?承诺模拟同步代码。
您可以将处理整个单个请求的逻辑放在一个函数中,然后再map
进行处理:
.map(processLine);
function processLine(line) {
return rp(BASE_URL + line).then(inspect);
}
重要的是要了解,这不是承诺代理模型的构件,而是核心属性。承诺表示单个任务(例如回调),而不是复数任务(例如事件发射器)。
如果您感兴趣的话,可能想要考虑一个可观察的系统或更具反应性的系统,也可以使用异步迭代器(实际上是“所需”语法)。我使用可观察的东西,因为它们在这里更容易使用,但是两者都可以工作:
new Observable(obs => {
let reqs = lines.map(x => rp(BASE_URL + line));
let counter = reqs.length;
for(let req of reqs) {
req.then(v => {
obs.onNext(v);
if(!--counter) obs.onCompleted();
});
}
}).map(u => { // every new value is available here
console.log(u); // use flatMap and return a promise if you want
// promise like chaining behavior
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句