当前位置: 首页 > 知识库问答 >
问题:

我在等待所有的promise得到解决

谷梁建中
2023-03-14

我在一个数组上循环,并对一个api进行异步调用,返回的数据需要我与一个不同的数组合并,合并时面临的问题是,一些promise尚未解决,因此合并后产生的数组丢失数据.任何想法如何去做这件事。(我对Angular是新的)。数组循环通过至少有200个元素(我不知道数组的大小提前)我从每个元素获得id,我调用这个服务:

for (i = 0; i < list.length; i++) {
     service.getRawHtml(list[i].service_object_id)
        .then(function(res){
            temp=htmlToArray(res);
            htmlDataList.push(temp);
    }, function(err){
         // error
    })
    }



service.getRawHtml=function (id){ 
   var defer = $q.defer();
        $http({
            method: 'GET',
            url: 'http://wlhost:50000/'+id
        }).success(function (response) {
            defer.resolve(response);
        }).error(function (data, status) {
            console.log("Failure");
            defer.reject(err);
    });
    return defer.promise;
}

提前谢谢。

共有3个答案

景温书
2023-03-14

只需说明@nodes解决方案:

var promisesToWaitFor = [];
for (i = 0; i < list.length; i++) {
    var promis = service.getRawHtml(list[i].service_object_id)
    promisesToWaitFor.push(promis)
}
$q.all(promisesToWaitFor).then(function(resultsArray) {
    var flatten = [].concat.apply([],resultsArray);
    temp=htmlToArray(flatten);
    htmlDataList.push(temp);
}, function(err) {
    // error
});
毛声
2023-03-14

正如@ndoes所建议的,这可以通过$q.all()来实现,它接受一系列promise,并在所有promise都得到解决时进行解决,或者在任何promise被拒绝时进行拒绝。

您正在for循环内调用将执行的异步函数,但是一旦所有函数调用完成,代码将同步继续。不会有任何神奇的事情等待着所有的promise去解决。

相反,您应该做的是将所有返回的promise推送到一个数组,然后使用$q.all()等待它们。

//Declare an array to which we push the promises
var promises = [];

for (i = 0; i < list.length; i++) {
    //Call the service and push the returned promise to the array
    promises.push(service.getRawHtml(list[i].service_object_id));
}

//Await all promises
$q.all(promises)
    .then(function(arrayOfResults){
        //Use your result which will be an array of each response after
        //it's been handled by the htmlToArray function
    })
    .catch(function(err){
        //Handle errors
    });

我借此机会同时重构了您的代码,因为它正在实现延迟反模式。由于$http已经返回promise,因此无需创建并返回新的promise。只需立即将其退回即可

service.getRawHtml = function (id){ 
   return $http({
            method: 'GET',
            url: 'http://wlhost:50000/'+id
        }).success(function (response) {
            return htmlToArray(response);
        }).error(function (data, status) {
            console.log("Failure");
            $q.reject(error);
    });
}
阙庆
2023-03-14

使用$q.all-来自文档:

将多个promise组合成一个promise,当所有输入promise都被解析时,该promise将被解析。

用法示例:

    $q.all([
        getPromise(),
        getPromise(),
        getPromise() 
    ]).then(function(value) {
        $scope.result1 = value[0];
        $scope.result2 = value[1];
        $scope.result3 = value[2];
    }, function(reason) {
        $scope.result = reason;
    });
 类似资料:
  • 所以我有一个情况,我有多个未知长度的promise链。我希望在处理完所有链后运行一些操作。这可能吗?这里有一个例子: 在本例中,我为promise一、promise二和promise三设置了一个,这些promise将在某个随机时间得到解决。然后,我在第一和第三段的末尾加上promise。我希望在解析所有链后解析。以下是我运行此代码时的输出: 有没有办法等待锁链解决?

  • 我正在努力学习如何正确使用async Wait,但我对它有点共同的想法。 在片段中,我试图构建一个对象数组,其中包含我需要的关于我在组件中上传的文件的信息。问题是this.fileInfo中的对象并没有完全等待返回编码图像的promise,而是在我console.logthis.fileInfo时返回此输出: 如您所见,关键图像是一个值未定义的ZoneAwarePromise。你能帮我修一下吗?

  • 我不乐观有办法做到这一点,但我想提出这个问题。情况:我正在写一个为新手程序员量身定制的JavaScript游戏引擎。我希望主脚本界面尽可能简单和可访问。理想情况下,脚本最终会看起来像这样: 在这个场景中,第一个背景会在一秒钟内完全淡入,然后第二个背景会同步淡入。问题出在哪里?JavaScript将在第一个命令完成之前尝试执行第二个命令。 现在,正确的处理方法是使用promise。类似的东西: 这完

  • 问题内容: 因此,我遇到了多个未知长度的promise链的情况。我希望在处理所有链条后执行一些操作。那有可能吗?这是一个例子: 在此示例中,我设置了一个承诺1,,2和3,这些承诺会在某个随机时间得到解决。然后,我将诺言添加到第一和第三的结尾。我想在所有链条都解决后解决。这是运行此代码时的输出: 有没有办法等待连锁解决? 问题答案: 当所有链条都解决后,我希望所有人解决。 当然,然后将每个链的承诺传

  • 我有一个问题,我无法通过谷歌搜索找到解决方案。 我有一个库,我正在使用它(不想编辑,除非真的有必要),它允许用户选择一个项目,然后调用我的自定义回调函数来修改该项目,然后继续使用它。 我需要在上面执行一些异步任务,这可能需要一些时间。这将创建一个竞争条件,因为当回调函数完成时,我的异步任务尚未完成,并且库继续其对项的工作。 如何等待我的两个异步任务完成,然后允许这个回调完成? 我唯一能想到的就是每

  • 假设我有2个或更多异步调用: 在脚本的后面,我想确保在使用变量之前设置了它们。 此示例代码遵循angularjs中的Firebase示例。 有什么想法吗?