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

angular $ q,如何在for循环内和之后链接多个promise

张可人
2023-03-14
问题内容

我想要一个for循环,该循环在每次迭代时调用异步函数

在for循环之后,我想执行另一个代码块,但在解决for循环中的所有先前调用之前,不要执行。

目前我的问题是,在所有异步调用完成之前执行了for循环之后的代码块,或者根本不执行该代码块。

带有FOR循环的代码部分及其后的代码块(有关完整代码,请参阅fiddle):

[..]
function outerFunction($q, $scope) {
    var defer = $q.defer();    
    readSome($q,$scope).then(function() {
        var promise = writeSome($q, $scope.testArray[0])
        for (var i=1; i < $scope.testArray.length; i++) {
             promise = promise.then(
                 angular.bind(null, writeSome, $q, $scope.testArray[i])
             );                                  
        } 
        // this must not be called before all calls in for-loop have finished
        promise = promise.then(function() {
            return writeSome($q, "finish").then(function() {
                console.log("resolve");
                // resolving here after everything has been done, yey!
                defer.resolve();
            });   
        });        
    });

    return defer.promise;
}

我创建了一个jsFiddle,可以在http://jsfiddle.net/riemersebastian/B43u6/3/中找到。

目前看来执行顺序很好(请参阅控制台输出)。

我的猜测是,这仅仅是因为每个函数调用都会立即返回,而无需执行任何实际工作。我试图用setTimeout延迟defer.resolve,但是失败了(即最后一个代码块从未执行过)。您可以在小提琴的注释框内看到它。

当我使用写入文件和从文件读取的实函数时,在最后一次写操作完成之前执行了最后一个代码块,这不是我想要的。

当然,该错误可能出在那些读/写功能之一中,但我想验证一下我在此处发布的代码没有问题。


问题答案:

您需要使用的是$
q.all
,它将多个诺言合并为一个诺言,只有当所有诺言都得到解决后才能解决。

在您的情况下,您可以执行以下操作:

function outerFunction() {

    var defer = $q.defer();
    var promises = [];

    function lastTask(){
        writeSome('finish').then( function(){
            defer.resolve();
        });
    }

    angular.forEach( $scope.testArray, function(value){
        promises.push(writeSome(value));
    });

    $q.all(promises).then(lastTask);

    return defer.promise;
}


 类似资料:
  • 我正在尝试使用角度构建一个网页。我只需要连接与第一个 ngFor 循环相关的第二个 ngFor 循环的数据。 HTML代码 2019 2018 2017 2016 1月 2月 3月 4月 6月 8月 8月 9月 10月 12月 (每个月和每年的所有数据都应如图所示) 2019 8月8日 - 数据 8月5日-数据 6月28日-数据 1月5日-数据 2018 12月29日-数据 12月21日-数据 1

  • 如果我像下面这样做一个异步调用,如何将它们与promise联系起来,这样我就可以按顺序做事了?在这个例子中,最终发生的是会将项按顺序推入。我更喜欢有promise的回答,但只要有效,什么都行

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:

  • 问题内容: 我有用nodejs编写的代码让我感到困惑 我希望循环内第二个函数中的数据可以推入结果 所以我以前的数据是这样的 像这样 我尝试了几种方法,首先输入命令deferred.resolve();。循环中仅显示1个数据的语句有什么解决方案? 问题答案: 而不是在将立即解决的数组上使用,而是使用它等待一个promise数组: 甚至更好:

  • 问题内容: 我在进行函数调用时试图找到for-each循环的工作方式。请参阅以下代码, 在版本1中,我在for- each循环中调用returnArr()方法,在版本2中,我显式调用returnArr()方法并将其分配给数组,然后对其进行迭代。两种方案的结果都相同。我想知道哪个更有效以及为什么。 我认为版本2会更高效,因为我不会在每次迭代中都调用method。但是令我惊讶的是,当我使用版本1调试代

  • 我想使用useEffect和for-loop生成多个JSX元素,但在本例中没有呈现任何内容。 警告代码:“React Hook useEffect缺少依赖项:”Render InfoCard“。请包含它或删除依赖项数组React-Hooks/EXEXTIVE-DEPS”