我在一个数组上循环,并对一个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;
}
提前谢谢。
只需说明@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
});
正如@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);
});
}
使用$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示例。 有什么想法吗?