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

连续执行本机JS Promise

华知
2023-03-14
问题内容

我必须为数组中每个项目的某些异步任务打电话给Promise,但我想串行执行这些任务。

Promise.all仅在具有合并了诺言列表但不按顺序调用它们的新诺言时才有用。

我如何在没有第三方库(例如Q,bluebird …)的情况下使用标准的Promise API来实现此目标。


问题答案:

您将诺言.then()与返回另一个诺言的回调一起使用。因此,假设您有三个函数a,b和c都返回了诺言。您可以像这样链接它们(按顺序执行):

a().then(b).then(c).then(function(result) {
   // all are done here
});

如果您正在处理数组,并且myFunc要对数组中的每个项目调用一个promise-returning函数,则可以对数组使用标准设计模式,并且promise
.reduce()可以一次遍历数组中的一个项目:

var items = [...];

items.reduce(function(p, item) {
    return p.then(function() {
        return myFunc(item);
    });
}, Promise.resolve());

事实证明,这实际上只是.then()像第一个示例中那样链接了一堆处理程序,而是使用的结构.reduce()为您遍历数组。

从ES2017开始,您还可以使用async / await依次处理数组,如下所示:

async function processArray(arr) {
    for (let item of arr) {
        let result = await somePromiseReturningFunc(item);
        // do something with result here before
        // going on to next array item
    }
    return someFinalResult;
}

processArray(someArray).then(result => {
    // done processing array here
}).catch(err => {
    // handle error here
});


 类似资料:
  • 问题内容: 我对Java 8中的lambda和异步代码都是陌生的。我不断得到一些奇怪的结果… 我有以下代码: 实际的代码要长得多,因为该方法会将一些数据发布到Web服务。但是,我可以使用此基本代码来复制我的问题。 我想让该方法执行100次,但出于性能方面的考虑而异步执行(以便将数据推送到Web服务的速度比执行100次同步调用的速度更快)。 在上面的代码中,“ doPost”方法运行随机次数,但始终

  • 我的一个朋友最近在网上发布了他的javascript游戏。你首先进入主页,然后点击一个按钮,把你带到游戏中。 当我检查元素时如下所示: 当有人点击这个时,计数器会递增,这样他就知道有多少人玩过了。他这样做只是为了练习,因为他实际上并不期望任何人能上场。 我想给他一个惊喜,让一个剧本不断地点击这个按钮,一遍又一遍地,让他觉得他有1000个剧本。(当我告诉他时,他会喜欢这个恶作剧的;) 有人知道这是否

  • 这是我的代码: 它抛出以下错误: 致命错误:未捕获的PDOExc0019: SQLSTATE[HY000]:常规错误: 2014当其他未缓冲的查询处于活动状态时,无法执行查询。考虑使用PDO语句::fetchAll()。或者,如果您的代码只针对mysql运行,您可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。--plhd--3/>(71): PD

  • 我有一个脚本,它需要两个每次都不相同的输入。所以我必须在每次运行脚本时手动输入。我确实想把这个脚本部署到Heroku。但遗憾的是,我无法在heroku:worker中手动给出任何种类的输入。我不能使用任何环境变量,参数,因为这两个输入不是静态的。所以heroku:worker总是得到“没有输入”的错误。 所以我决定用命令< code > heroku run python 3 main . py

  • 我制作了一个程序,要求用户输入5位数字,然后程序将查找这些数字的总和。我想知道我怎样才能使程序在计算一次之后一遍又一遍地要求一个数字。我希望用户再试一次,直到他自己想退出。

  • 我实现了两个线程,一个打印整数,另一个打印英文字母。这些线程应该串联工作。 我使用同步块,一次只有一个线程将保持锁。但不知何故,AtomicInteger 没有按预期工作。一个线程对计数变量所做的更改对其他不同线程不可见。这怎么可能。我错过了什么吗? 我的实施 导入java.util.concurrent.atomic.原子整数; 公共类ThreadWaitEg{ } 输出 从主线程 从打印编号