Библиотека мыла Angularjs бросает typeError в Firefox, а не в Chrome

Я использую мыльную услугу для AngularJS от Andrew McGivery

Он отлично работает при вызове из Chrome, но он возвращает typeError в Firefox и IE11.

TypeError: e имеет значение null в строке angular.soap.js 16

Этот код выглядит следующим образом:

.factory("$soap",['$q',function($q){
    return {
        post: function(url, action, params){
            var deferred = $q.defer();

            //Create SOAPClientParameters
            var soapParams = new SOAPClientParameters();
            for(var param in params){
                soapParams.add(param, params[param]);
            }

            var soapCallback = function(e){
                //ERROR THROWN ON LINE BELOW
                if(e.constructor.toString().indexOf("function Error()") != -1){
                    deferred.reject("An error has occurred.");
                } else {
                    deferred.resolve(e);
                }
            }

            SOAPClient.invoke(url, action, soapParams, true, soapCallback);

            return deferred.promise;
        },
        setCredentials: function(username, password){
            SOAPClient.username = username;
            SOAPClient.password = password;
        }
    }
}]);

e в Chrome - это объект, возвращаемый моей веб-службой (пользовательский объект), в Firefox это null, и я не знаю, где искать библиотеку для отладки проблемы.

UPDATE:

Мой контроллер выглядит следующим образом:

.controller('SoapCtrl', function($soap) {

    this.login = function(credentials) {

        $soap.post('MYAPI', 'MYMETHOD', {login: credentials.login, password: credentials.password}).then(function(data) {
            console.log(data.userid);
        });
    }

})

Я также попытался вызвать тот же web-сервис из плагина jquery jquery.soap внутри моего приложения angular, и я получаю ожидаемое поведение в как Chrome, так и Firefox.

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ

Поскольку это профессиональный проект, мы решили перейти к плагину, который работает. jquery.soap

2 вопроса были опубликованы на странице автора без ответа на данный момент.

Я бы присвоил награду правильному ответу, но половина щедрота автоматически переходит к ответу с 2 upvotes...

Ответы

Ответ 1

в функции SOAPClient._getElementsByTagName
Я меняю линию
return document.getElementsByTagName(tagName);
Для
return document.getElementsByTagNameNS("*", tagName);

работайте для меня!

Ответ 2

В библиотеке проверьте файл soapclient.js, на строке 195

SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req) 
{
    var o = null;
    var nd = SOAPClient._getElementsByTagName(req.responseXML, method + "Result");
    if(nd.length == 0)
        nd = SOAPClient._getElementsByTagName(req.responseXML, "return");   // PHP web Service?
    if(nd.length == 0)
    {
        if(req.responseXML.getElementsByTagName("faultcode").length > 0)
        {
            if(async || callback)
                o = new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
            else
                throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);           
        }
    }
    else
        o = SOAPClient._soapresult2object(nd[0], wsdl);
    if(callback)
        callback(o, req.responseXML);
    if(!async)
        return o;
}

если вы скажете, что в firefox значение e это null, потому что в этом методе переменная o никогда не устанавливается. Отладка этого метода будет полезной.