在调用$ q.all()

时间:2018-04-24 13:02:32

标签: angularjs firebase firebase-realtime-database angularfire

我正在使用AngularJS和AngularFire。

我正在使用两个$ firebaseArrays,其中包含的对象基本上是彼此的替代版本。它们包含不同的数据,但会同时添加到数组中并从数组中删除,因为它们必须始终彼此对齐。出于这个原因,我需要使用相同的Firebase生成的唯一ID来保存它们。

保存的数组将复制到我的组件中,以便可以更改它们,从而可以选择将更改保存回原始数组,或者将其丢弃。

//The currently saved versions of the arrays.
var db = firebase.database().ref();

var mainArrayRef = db.child('mainArray');
var alternateArrayRef = db.child('alternateArray');

vm.originalMainArray = $firebaseArray(mainArrayRef);
vm.originalAlternateArray = $firebaseArray(alternateArrayRef);

//Copy the original arrays in order to make changes that can then be saved.
vm.activeMainArray = angular.copy(vm.originalMainArray);
vm.activeAlternateArray = angular.copy(vm.originalAlternateArray);

vm.activeMainArray.push( { value: x } );
vm.activeAlternateArray.push( { value: y } );

在向数组添加新项目时,我需要循环遍历activeMainArray,将数据保存到Firebase并将Firebase生成的唯一键附加到数组中的每个项目,以便在处理activeAlternateArray时,相应的可以使用相同的firebase生成唯一ID来保存对象。

function saveObjectsToFirebase(originalArray, activeArray, preprocessedArray){

    //preprocessedArray is available during the processing of the alternateArray

    var promises = [];

    for(var i=0; i < activeArray.length; i++){

        var newObject = angular.copy(activeArray[i]);

        //If this is the main array, use standard methods to create unique id.
        if(!preprocessedArray){
            promises.push(originalArray.$add(newObject)
            .then(function(firebaseObject){

                //The newly created firebase id is attached to the object.
                activeArray[i].id = firebaseObject.key
                console.log(newObject.id)
            })
        }

        //If this is the alternateArray (and the main array has been preprocessed and sent to this function)...
        if(preprocessedArray){

            //Get the firebase id from the corresponding object in the main array.
            var id = preprocessedArray[i].id;

            promises.push(originalArray.$ref().child(id).set(newObject))

        }

    return promises;
}

var mainArrayPromises = saveObjectsToFirebase(vm.originalMainArray, vm.activeMainArray);

$q.all(mainArrayPromises).then(function(){

    var alternateArrayPromises = saveObjectsToFirebase(vm.originalAlternateArray, vm.activeAlternateArray, vm.activeMainArray);


    $q.all(alternateArrayPromises).then(function(){
        //The rest of the function
    });
});

我需要做的就是确保在$ q.all(mainArrayPromises)运行时,将firebase密钥附加到主数组中的对象的.then()函数已经完成,因此密钥可用何时处理备用数组。我假设它将涉及$ q.when()或$ q.defer(),但我不确定如何在循环内生成的promise数组的结构中实现它。

奇怪的是,console.log输出将在处理第二个数组之前记录id,此时id实际上不可用并且将是未定义的。我不知道是这样的。

我希望这对你的时间有所帮助和感谢。

0 个答案:

没有答案