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

使angular.forEach等待下一个对象后的承诺

滕令雪
2023-03-14
问题内容

我有一个对象列表。对象将传递给延迟函数。我只想在上一次调用解决后才使用下一个对象调用函数。有什么办法可以做到吗?

angular.forEach(objects, function (object) {
    // wait for this to resolve and after that move to next object
    doSomething(object);
});

问题答案:

在ES2017之前和之后async/await(请参见下文中的ES2017中的选项),.forEach()如果要等待诺言就不能使用,因为诺言没有阻塞。Javascript和Promise不会那样工作。

  1. 您可以链接多个promise,并使promise基础结构对它们进行排序。

  2. 您可以手动进行迭代,并且仅在先前的承诺完成时才进行迭代。

  3. 您可以使用类似的库,asyncBluebird将为您排序的库。

有很多其他选择,但.forEach()不会为您做。

这是一个使用promise与角度promise的链进行排序的示例(假设objects是一个数组):

objects.reduce(function(p, val) {
    return p.then(function() {
        return doSomething(val);
    });
}, $q.when(true)).then(function(finalResult) {
    // done here
}, function(err) {
    // error here
});

而且,使用标准的ES6许诺,将是:

objects.reduce(function(p, val) {
    return p.then(function() {
        return doSomething(val);
    });
}, Promise.resolve()).then(function(finalResult) {
    // done here
}, function(err) {
    // error here
});

这是一个手动排序的示例(假设objects是一个数组),尽管它不像上面的选项那样报告回完成或错误:

function run(objects) {
    var cntr = 0;

    function next() {
        if (cntr < objects.length) {
            doSomething(objects[cntr++]).then(next);
        }
    }
    next();
}

ES2017

在ES2017,该async/wait功能确实使用非功能基于循环比如当让你“等待”诺言继续循环迭代之前履行forwhile

async function someFunc() {
    for (object of objects) {
        // wait for this to resolve and after that move to next object
        let result = await doSomething(object);
    }
}

代码必须包含在一个async函数中,然后您可以await用来告诉解释器在继续循环之前等待承诺解决。注意,虽然这似乎是“阻止”类型的行为,但它并不阻止事件循环。事件循环中的其他事件仍可以在期间进行处理await



 类似资料:
  • 请有人帮我;我使用的是for循环,它循环遍历数组中的每个项目(文档名称),每个项目调用一个上传相应文档的函数。 我的问题是在文档完成上传之前,for循环已经移动到下一个项目。如何让我的for循环等到调用函数完成后再处理下一个数组项目? 非常感谢您的帮助。 我的代码; 编辑我用下面的代码得到了这个;

  • 问题内容: TL; DR 如何转换成? 我现有的代码使用Bolts构建了一系列异步任务,并等待所有这些任务完成后再执行其他步骤。本质上,它会构建a 并返回一个列表,当Bolts站点上的示例按照列表中的 所有 任务完成时,将其标记为已完成。 __ 我正在寻找替换方法,并且我假设这种方法可以构建异步任务列表(大小未知)并将它们全部包装为一个,但是我不知道如何。 我试着看,,等…但不能去工作的,我会被建

  • 我是新来玩框架和AKKA,我是Java开发者。我使用Play 2.3.7和IntelliJ 14。我调用了Pattern.ask,它返回一个Future对象,该对象具有来自Web服务调用的String。通过控制台,我可以发现我的演员能够接收请求并执行操作。我不知道如何解析它回来。我试图用wait.result.阅读未来,但这wait.result期待的对象。如果传递Future对象,它将引发编译器

  • 问题内容: 我目前正在等待所有承诺按顺序完成,如下所示: 但是,通过这种方式,配置文件和令牌将顺序执行。由于两者彼此独立,因此我希望两者一起独立执行。我认为可以使用Promise.all完成此操作,但是我不确定语法,也找不到任何帮助。 所以我的问题是如何转换上面的api调用以一起运行,然后返回最终输出。 问题答案:

  • 问题内容: 在 puppeteer中, 我想等待定义的时间后再转到下一行代码。 我尝试将a 放入评估函数中,但似乎只是被忽略了 此代码不等待,仅 在等待之前 和 之后 编写 __ 你知道怎么做吗? 问题答案: 您可以使用一点承诺功能, 然后,在需要延迟的任何时候调用它。 如果必须使用操纵符,请使用内置的waitFor函数。 如果仍然要使用page.evaluate,请在4​​秒钟后解决。您没有解决

  • 下面的函数不能像我希望的那样工作;作为一个JS新手,我不明白为什么。 我需要它等待5秒钟,然后检查是否为。 目前,它不等待,只是立即检查。