Saya mengalami masalah dengan waktu masuk di aplikasi sudut. Maksud saya adalah ketika pengguna masuk, kunci API itu kemudian disetel di Penyimpanan lokal dan tersedia untuk dipanggil untuk mengakses API. Setelah masuk, saya ingin aplikasi mengarahkan pengguna ke keadaan asal. Tetapi yang terjadi adalah pengguna dialihkan, mendapat 401 - dan berdasarkan apa yang saya siapkan - kemudian diarahkan kembali untuk masuk. Jika saya melakukan hard refresh pada browser setelah login berhasil. Berikut adalah apa yang saya telah pergi.

.factory('localStor', function($q, $log, $window, $rootScope) {
var apiKey = false;

return {
    getAPI: function() {
        return $q(function(resolve, reject) {
            var data = $window.localStorage.getItem('apiKey');

            if (data == null) {

                return $rootScope.$broadcast('notAuthorized');
            } else {
                var key = data;
                return resolve(key);

            }

        });
    },
    setAPI: function(key) {
        return $q(function(resolve, reject) {
            apiKey = false;
            if (key === undefined) {
                return reject();
            }

            return $window.localStorage.setItem('apiKey', key);
        });
    }
}


})

function getLogin(email, password) {
    return $q(function(resolve, reject) {
        $http({
            method: 'POST',
            data: {
                'email': email,
                'password': password
            },
            url: config.api.baseUrl + '/user/login'
        }).then(function(result) {
            if (result) {
                var token = result.data.data.token;
                resolve(token);
            } else {
                $log.debug('Incorrect email or password');
                reject(1);
            }
        }, function(reason) {
            reject(2);
        });

    })
}

$scope.submitLogin = function(email, password, form) {

    $scope.errorNote = false;

    if (form.$valid) {
        $scope.loading = true;
        login.getAPI(email, password).then(function(data) {
            var key = data;
            localStor.setAPI(key).then(function() {
                $timeout(function() {
                    $state.go('app.loading', {}, { reload: true });
                }, 30);
            });
            $scope.loading = false;


        }, function(reason) {
            $scope.errorNote = reason;
            $scope.loading = false;
        });

    }
};

Panggilan saya ke API kemudian diatur seperti ini

var apiKey = false;
localStor.getAPI().then(function(data) {
    apiKey = data;
    $log.debug(apiKey);
}, function() {
    $rootScope.$broadcast('notAuthorized');
});

function withApiKey(callback, errorcallback) {
    localStor.getAPI().then(function(data) {
        if (typeof callback === 'function') {
            callback(data);
        }
    }, function(err) {
        if (typeof errorcallback === 'function') {
            errorcallback(err);
        }
    });
}

function notificationCount() {
    return $q(function(resolve, reject) {
        withApiKey(function(key) {
            $http({
                method: 'GET',
                headers: { 'Authorization': 'Bearer ' + key },
                url: config.api.baseUrl + '/user/notifications/count'
            }).then(function(result) {
                if (result) {
                    resolve(result);
                } else {
                    reject('Uh Oh');
                }
            }, function() {
                reject('Uh Oh');
            });
        });
    })
}
0
user641957 14 Agustus 2017, 19:50

2 jawaban

Jawaban Terbaik

Akhirnya menjadi ketidakcocokan variabel. Struktur janji di atas bekerja dengan baik setelah ketidakcocokan diatasi.

0
user641957 14 Agustus 2017, 22:40

Apakah ini Anti-Pola $q(resolve, reject)?

Menggunakan $q(resolve, reject) dengan layanan $http adalah contoh lain dari $q defer anti-pola. Itu tidak perlu dan rentan terhadap implementasi yang salah.

Cukup kembalikan $http janji. Gunakan metode .then untuk mengubah respons:

function getLogin(email, password) {
    ̶r̶e̶t̶u̶r̶n̶ ̶$̶q̶(̶f̶u̶n̶c̶t̶i̶o̶n̶(̶r̶e̶s̶o̶l̶v̶e̶,̶ ̶r̶e̶j̶e̶c̶t̶)̶ ̶{̶
    ͟r͟e͟t͟u͟r͟n͟ $http({
            method: 'POST',
            data: {
                'email': email,
                'password': password
            },
            url: config.api.baseUrl + '/user/login'
        }).then(function(result) {
            if (result) {
                var token = result.data.data.token;
                ̶r̶e̶s̶o̶l̶v̶e̶(̶t̶o̶k̶e̶n̶)̶;̶
                ͟r͟e͟t͟u͟r͟n͟ token;
            } else {
                $log.debug('Incorrect email or password');
                ̶r̶e̶j̶e̶c̶t̶(̶2̶)̶;̶
                ͟t͟h͟r͟o͟w͟  1;
            }
        }, function(reason) {
            ̶r̶e̶j̶e̶c̶t̶(̶2̶)̶;̶
            ͟t͟h͟r͟o͟w͟  2;
        });
    })
}

Metode .then mengembalikan janji baru yang sesuai dengan apa yang masing-masing penangan kembalikan atau lempar.

Untuk informasi lebih lanjut, lihat Anda Melanggar Inti Janji.

0
Community 20 Juni 2020, 09:12