Ember同步循环与服务

时间:2017-04-13 07:38:24

标签: javascript ember.js promise synchronization

如何实现同步循环? 我正在循环一个具有id s的数组。使用id我从API获取记录并进行一些计算。

我想要的是调用一个函数或执行一段代码只有在逐个执行后才能在循环中完成

我尝试过以下代码:

let cnt = 0;
let successFrwrd = 0;
let failReqFrwrd = 0;
let failRecapFrwrd = 0;
this.checkedItems.forEach((item) => {   
    self.get('store').query('instances', {
        filter : {
            id : item.get('id')
        }
    }).then(instances => {
        if (!instances.get('length')){
            throw new Error();
        }
        if (instances.get('status')===2){
            failReqFrwrd++;
            throw new Error();
        }
        if (instances.get('status')===4){
            failRecapFrwrd++;
            throw new Error();
        }
        return instances.save();
    }).then( () => {
        successFrwrd++;
    }).catch(() => {
        return null;
    });
    cnt++;
    if(cnt === this.checkedItems.length){
        if(successFrwrd > 0){
            console.log(successFrwrd+' Completed' );
        }
        if(failRecapFrwrd >0){
            console.log(failRecapFrwrd+' Recap Fails' );
        }
        if(failReqFrwrd>0){
            console.log(failReqFrwrd+' Request fails' );
        }
    }
});

但每次我得到的所有反价值都是ZERO。可能需要显示更多失败原因。

1 个答案:

答案 0 :(得分:1)

IIRC,forEach不等你的承诺。请使用reduce。见this sample twiddle

另外,要小心承诺链:你不应该破坏承诺链。始终从内部功能返回正确的承诺。看来你没有从函数中返回一个承诺。