完成任何承诺后是否有可能兑现承诺?

埃萨克

我有一个要向其发出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);
})
本杰明·格伦鲍姆(Benjamin Gruenbaum)

我有一个要向其发出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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章