Не могу использовать библиотеку Angular $ q в Visual Studio (Apache cordova)

0

Мне нужно использовать $ q, чтобы дождаться завершения моей асинхронной функции, а затем сделать что-то.

Однако я попытался ввести $ q в мой угловой модуль, а также мои угловые функции, и я получаю сообщение $ q не определено.

Может ли кто-нибудь сказать мне, как я могу использовать его в своем коде?

Вот код для модуля и функция, которую я хочу использовать $ q соответственно

модуль

var droidSync = angular.module('droidSync', ['ionic', 'ngRoute', 'ui.router']);

Контроллер и функция
В этом случае я хочу подождать results.forEach Чтобы закончить, я хочу скрыть свой экран загрузки с помощью $ionicLoading.hide()

droidSync.controller('mainController', function ($scope, $ionicLoading) {

    $scope.syncContacts = function () {
        //Display a loading screen while sync is in execution
        $ionicLoading.show({
            template: '<p>Syncing Contacts...</p><ion-spinner class="spinner-calm" icon="crescent"/>'
        });
        var table = AzureService.getTable('contact');
        table.read().done(function (results) {
            
            results.forEach(function (result) { //THIS NEEDS TO BE COMPLETE BEFORE HIDING LOAD SCREEN

                console.log('result is', result);
                // If the contact is flagged as deleted check if its on the device and delete it
                if (result.isdeleted == true) {
                    var options = new ContactFindOptions();
                    options.filter = result.id;
                    options.multiple = false;
                    var fields = ["*"];
                    navigator.contacts.find(fields, findSuccess, findError, options);
                    function findSuccess(contact) {
                        if (contact.length > 0) {
                            console.log("inside the delete area:", contact);
                            var contactToDelete = navigator.contacts.create();
                            //It is safe to use contact[0] as there will only ever be one returned as AzureID is unique
                            contactToDelete.id = contact[0].id;
                            contactToDelete.rawId = contact[0].id;
                            console.log('we want to delete this', contactToDelete);
                            contactToDelete.remove();
                            console.log('Contact Deleted');
                        }
                        else {
                            console.log('Contact to delete not present on device. Checking next contact');
                        }
                    }
                    function findError() {
                        console.log('Contact search failed: Deleted Contact Search');
                    }
                }
                else {
                    //create a contact object to save or update
                    var emails = [];
                    var phoneNumbers = [];
                    var name = new ContactName();
                    var contactToUpdate = navigator.contacts.create();
                    contactToUpdate.note = result.id;
                    name.givenName = result.firstname;
                    name.familyName = result.lastname;
                    phoneNumbers[0] = new ContactField('mobile', result.mobilephone, true);
                    phoneNumbers[1] = new ContactField('home', result.homephone, false);
                    emails[0] = new ContactField('work', result.email, true);
                    contactToUpdate.name = name;
                    contactToUpdate.phoneNumbers = phoneNumbers;
                    contactToUpdate.emails = emails;

                    //Search for the contact on the device
                    var options = new ContactFindOptions();
                    options.filter = result.id;
                    options.multiple = false;
                    var fields = ["*"];
                    navigator.contacts.find(fields, foundSuccess, foundError, options);

                    function foundSuccess(contact) {
                        if (contact.length > 0) {
                            //The contact has been found on the device. Pass in ids for contact, emails and phone numbers to update.
                            console.log('object to update is object is', contact);
                            console.log('contact array length is ', contact.length);

                            contactToUpdate.id = contact[0].id;
                            contactToUpdate.rawId = contact[0].rawId;
                            contactToUpdate.phoneNumbers[0].id = contact[0].phoneNumbers[0].id;
                            contactToUpdate.phoneNumbers[1].id = contact[0].phoneNumbers[1].id;
                            contactToUpdate.emails[0].id = contact[0].emails[0].id;
                            console.log('about to save this', contactToUpdate);
                            contactToUpdate.save(upSuccess, upError);
                            function upSuccess() {
                                console.log('updated a contact!');
                            }
                            function upError(ContactError) {
                                console.log('error updating a contact!');
                            }
                        }
                        else {
                            //The contact does not exist on the device. Just save it.
                            console.log('non existent contact: ', contactToUpdate);
                            contactToUpdate.save(saveSuccess, SaveError);
                            function saveSuccess() {
                                console.log('saved a contact!');
                            }
                            function SaveError() {
                                console.log('error saving a contact!');
                            }
                        }
                    }
                    function foundError() {
                        console.log('Contact search failed: Undeleted Contact Search');
                    }
                } // end else
            })) // end forEach
        }) // table.read()
    }; // scope.syncContacts()
});
Теги:
angular-promise
visual-studio-cordova

1 ответ

0

Так что, наверное, я бы сделал что-то вроде этого

Это полностью непроверенный код, так что сделайте это за то, что вы будете

$ q.all - это то, что вы хотите посмотреть в

droidSync.controller('mainController', ["$scope", "$q", "$ionicLoading", 
    function ($scope, $q, $ionicLoading) {

var loop = function(result){
    var deferred = $q.defer();

    deferred.resolve(// your loop stuff);

    return deferred.promise;
};

var loopingFunction = function(results){
    var promises = [];

    results.forEach(function(result){
        promises.push(loop(result));
    });

    return $q.all(promises);
};


$scope.syncContacts = function () {
    //Display a loading screen while sync is in execution
    $ionicLoading.show({
        template: '<p>Syncing Contacts...</p><ion-spinner class="spinner-calm" icon="crescent"/>'
    });
    var table = AzureService.getTable('contact');
    table.read().done(function (results) {
        loopingFunction(results).then(function(){
            // do something after it finishes
            $ionicLoading.hide()
        });
    });
};
}]);
  • 0
    Мне не нужно использовать результат моего кода после завершения функции. Мне нужно только знать, что он завершен, поэтому я могу запустить $ionicLoading.hide()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню