【问题标题】:Angular.foreach asynchronous callback not workingAngular.foreach 异步回调不起作用
【发布时间】:2015-12-09 09:21:00
【问题描述】:

我正在尝试检测 foreach 语句是否与 foreach 中的语句一起完成。根据我的研究,许多人要求使用 Promise。当我实现它时,它并没有按照我期望的方式执行。

var uploadUrl = "/api/upload";
$('#add_product').closeModal();
 var promises = angular.forEach(vm.images_selected, function(value , key){
    return File_Upload.uploadFileToUrl(value, uploadUrl)
    .success(function(result){
        vm.images_selected_uploaded.push(result);
        console.log('here')
    });
})
$q.all(promises).then(function () {
    console.log('there')
    console.log(vm.images_selected_uploaded)
})

从上面的代码(假设值长度为2,输出将是

there
here
here

我真正想要的是这里这里那里。我在这里错过了什么?

【问题讨论】:

  • 您应该将success 移至$q.all() 中的then。
  • .forEach 应该是 .map (假设 angular.forEach/angular.map 在功能上类似于 array.prototype.forEach/array.prototype.map ...嗯,没有 angular.map 。 ..

标签: javascript angularjs foreach promise


【解决方案1】:

第一个问题,angular.forEach 返回对第一个参数的引用,因此它们不会是您正在寻找的承诺

第二个问题,angular 并没有替代 .map

如果你将 promise 保存在 promises 数组中,你可以这样做

var uploadUrl = "/api/upload";
$('#add_product').closeModal();
var promises = [];
angular.forEach(vm.images_selected, function(value , key){
    promises.push(File_Upload.uploadFileToUrl(value, uploadUrl)
        .success(function(result){
            vm.images_selected_uploaded.push(result);
            console.log('here')
        })
    );
})
$q.all(promises).then(function () {
    console.log('there')
    console.log(vm.images_selected_uploaded)
});

【讨论】:

    【解决方案2】:

    类似这样的:

    var uploadUrl = "/api/upload";
    $('#add_product').closeModal();
    var promises = [];
    angular.forEach(vm.images_selected, function(value , key){
        promises.push(File_Upload.uploadFileToUrl(value, uploadUrl));
    });
    $q.all(promises).then(function (results) {
        for(var i = 0; i < results.length; i++){
           var result = results[i];
           vm.images_selected_uploaded.push(result);
           console.log('here');
        }
        console.log('there');
        console.log(vm.images_selected_uploaded);
    })
    

    或者可能是这样的:

    var uploadUrl = "/api/upload";
    $('#add_product').closeModal();
     var promises = [];
     angular.forEach(vm.images_selected, function(value , key){
        var promise = File_Upload.uploadFileToUrl(value, uploadUrl);
        promise.success(function(result){
            vm.images_selected_uploaded.push(result);
            console.log('here');
        });
        promises.push(promise);
    })
    $q.all(promises).then(function () {
        console.log('there');
        console.log(vm.images_selected_uploaded);
    })
    

    顺便说一句,两者都未经测试。

    【讨论】:

    • 我想我已经明白了。感谢 Arg0n!您的解决方案就像一个魅力!
    • 也许还有更多您的目标。这样他们可以按任何顺序完成,您将在所有完成之前在控制台中获得“这里”。当您需要完成所有结果才能做某事时,第一个使用较多。
    • 你说得对,我会使用第一个,因为我需要完成结果。谢谢
    • 这看起来并没有改变任何东西...... promises 是原始的 vm.images_selected 数组,而不是一组 promises - 除非有角度文档存在 - 但是,它显然有效,所以我该怎么做知道
    • @JaromandaX 你能提供你正在阅读的内容的链接吗?
    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2019-11-12
    相关资源
    最近更新 更多