当前位置: 首页 > 面试题库 >

获得第一个兑现的诺言

周飞
2023-03-14
问题内容

如果我有两个诺言A和B,其中只有一个诺言会成功,那么我如何才能成功实现一个诺言呢?我正在寻找与相似的东西Promise.race,但只会返回实现的第一个诺言。我正在使用ES6的承诺。


问题答案:

反转承诺的极性,然后可以使用Promise.all,因为它在第一个被拒绝的承诺上拒绝,它在反转后对应于第一个已实现的承诺:

const invert  = p  => new Promise((res, rej) => p.then(rej, res));

const firstOf = ps => invert(Promise.all(ps.map(invert)));



// Utility routines used only in testing.

const wait    = ms => new Promise(res => setTimeout(() => res(ms), ms));

const fail    = f  => Promise.reject(f);

const log     = p  => p.then(v => console.log("pass", v), v => console.log("fail", v));



// Test.

log(firstOf([wait(1000), wait(500) ]));

log(firstOf([wait(1000), fail("f1")]));

log(firstOf([fail("f1"), fail("f2")]));

这将返回第一个已兑现的诺言的值,或者如果全部被拒绝,则返回一系列拒绝原因。



 类似资料:
  • 问题内容: 我不明白…是我还是这是节点中的错误? 可以按预期进行: 这发出了警告: 我懂了 问题答案: 使用与承诺回报新希望(这就是所谓的链接)。因此,当您执行以下操作时: 您的最初承诺在哪里,您将在第1行上创建一个新的承诺(现在不再存在。我们称它为 )。因此,即使您使用with ,也不会处理上的拒绝,这解释了您在控制台上看到的消息。 为了避免出现此消息,您应该在第1行的新承诺中添加a

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会执行您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • 问题内容: 我陷入了我认为应该直截了当的事情。我需要从三个不同的ajax调用中获取数据,组合并处理所有三个,并将结果数组显示给用户。 以最简单的形式,我的代码如下所示: 我知道我的变量分配给了Promise,而不是实际结果,并且http请求已传递到事件队列。如果我在这些后面加上可执行语句,则这些变量将是未定义的。我不明白如何等待这些诺言解决以继续处理它们。 我想立即添加以下代码: 问题是,我不能像

  • 我正在解析明文电子邮件,一旦我有了正文文本,我想把它删减到第一段。

  • 问题内容: 我正在从Angular的文档中查看此示例,但是我认为这可能总体上适用于Promise。下面的示例是从文档中逐字复制的,并附有评论: 我不清楚这是如何工作的。如果我可以调用第一个的结果并将它们链接起来(据我所知),那么它就是一个类型为Promise的对象。这不是一个。那么,“它的值将是promiseA的结果增加1”的含义是什么? 我应该以这种方式访问吗?成功回调如何返回承诺并返回“结果+

  • 问题内容: 我遇到了问题,我的指令只有在我的诺言得到解决后才能呈现其内容。我以为应该这样做,但是似乎没有用。 这是我的控制器: 我的指令: 范围返回还可以,当我在开发工具中检查它时并没有定义,但是我想这是因为到我检查它时,诺言已经解决了吗? 但是,返回undefined。 问题答案: 因为您的值是异步填充的,所以您需要添加一个监视函数来更新绑定的元素。 您还可以将很多复杂性转移到指令控制器中,并使