【问题标题】:How to make $q.all work in this case?在这种情况下如何使 $q.all 工作?
【发布时间】:2015-07-24 04:52:06
【问题描述】:

我正在尝试在下面的代码中使用 $q.all。但我认为我误解了一些关键想法,因为它没有按我预期的那样工作。如果有人能给我一些建议,将不胜感激。

问题出在$q.all(toSend.pie.slices).then():

var someData = {...};
var toSend = {
    pie: {
        slices: []
    }
};

toSend.pie.slices = generatePieSlice(someData);


$q.all(toSend.pie.slices).then(function(data){
    if(data) {      
        console.log(data);  // this is undefined :(        
        //do something else
    }
});  



function generatePieSlice(data) {
    var arr = [];
    if(data) {
        angular.forEach(data, function(resp_o, resp_n){
            arr.push({
                name: resp_o.display,
                marketValue: resp_o.value,
                percentage: resp_o.percentage,
                key: resp_n
            });
        });
    }
    $q.all(arr).then(function(data) {
        if(data) {
            console.log(data); // this gives me with the correct data
            return data;
        }
    });

}

【问题讨论】:

  • $q.all 用于承诺的集合。我在您的 toSend.pie.slicesarr 数组中看不到任何承诺。此外,generatePieSlice 不会返回任何内容
  • @Phil,感谢您的提示,理论上这对我来说很有意义,但我不太确定如何实现它。你能告诉我工作代码可能是什么吗?
  • 出于某种原因,您要执行两次$q.all()。省略第二个调用,toSend.pie.slices已经是一个promise(如果你从generatePieSlice返回),你可以直接在它上面调用.then
  • @Bergi,但我认为最好不要直接在函数中操作全局变量?这就是我尝试通过 generatePieSlice 函数返回数组的原因。
  • @muudless:你指的是哪个全局变量?是的,你绝对应该 return 来自你的 generatePieSlice 函数。

标签: javascript angularjs


【解决方案1】:

感谢所有评论者的帮助。这是我为其他感兴趣的人提供的最终解决方案:)

var someData = {...};
var toSend = {
    pie: {
        slices: []
    }
};


$q.all({

    pieSlices: generatePieSlice(someData)

}).then(function(data){

    if(data) {      
        toSend = {
            pie: {
                slices: data.pieSlices
            }
        };

        // deferred.resolve(toSend) or something else :)
    }

});  


function generatePieSlice(response) {
    var arr = [];
    if(response) {
        angular.forEach(data, function(resp_o, resp_n){
            arr.push({
                name: resp_o.display,
                marketValue: resp_o.value,
                percentage: resp_o.percentage,
                key: resp_n
            });
        });
    }                
    return arr;
}

【讨论】:

  • 是的,但只要您没有任何 async 操作,这没有任何意义,而且这是一种矫枉过正。
  • @code-jaff,我确实发生了很多异步操作,这只是我代码的一小部分
  • 如果您要否决我的答案,那么也许您可以提供更好的答案以获得更具建设性的回应。毕竟,这应该是一个互相帮助的社区:)
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2017-06-21
  • 2018-01-19
  • 2021-12-06
  • 2020-12-27
相关资源
最近更新 更多