मेरे पास सेवा है जो बाहरी एपीआई के साथ एकीकृत है। यह एपीआई असंगत है और इसे बदलने की संभावना नहीं है।

एपीआई के अंदर रिपोर्टिंग त्रुटि के 2 तरीके हैं, एक HTTP 500 कोड के साथ प्रतिक्रिया है, अन्य सामान्य 200 HTTP रिपीटर है, लेकिन JSON में status के साथ "त्रुटि" पर सेट है।

500 त्रुटि को हैंडल करना ठीक काम कर रहा है, मैंने responseError पद्धति के साथ इंटरसेप्टर (ngResource इंटरसेप्टर, $ http एक नहीं) बनाया है जो एपीआई से कोई 500 प्रतिक्रिया होने पर उपयोगकर्ता को त्रुटि संदेश प्रदर्शित करेगा:

.factory('ApiErrorHandling', ['ngDialog', function(ngDialog) {
    return {
        responseError: function(response) {
            console.log(response);
            var error_dialog = ngDialog.open({
                template: '/api/error.html',
                className: 'error',
                preCloseCallback: function() {
                    if (response.data.status == 'fatal') {
                        window.location.href = '/';
                    } else if (response.data.status == 'error') {
                        var dialogs = ngDialog.getOpenDialogs();
                        for (var i in dialogs) {
                            var dialog = dialogs[i];
                            if (dialog != error_dialog.id) {
                                ngDialog.close(dialog);
                            }
                        }
                    }
                },
                data: {
                    code: response.data.code,
                    status: response.data.status,
                    message: response.data.message,
                    httpCode: response.status,
                }
            });
        },
    }
}])
.factory('ApiMethod', ['$resource', 'ApiErrorHandling', function($resource, ApiErrorHandling) {
    return $resource('/api/method/', {}, {
            query: {method:'POST', interceptor: ApiErrorHandling},
    });
}])

लेकिन मुझे status त्रुटि प्रतिक्रियाओं से निपटने में समस्या है। मैं सामान्य सफलता कॉलबैक (संसाधन उदाहरण से विधि में पारित) नहीं चाहता हूं जब त्रुटि होती है, तो मुझे एक वैश्विक त्रुटि हैंडलर चाहिए, लेकिन मैंने अभी तक काम नहीं किया है। हर बार प्रतिक्रिया कॉलबैक में दी जाती है। मैंने अब तक कोशिश की है:

  • इंटरसेप्टर से response विधि में $ q.reject लौटाते हैं
  • इंटरसेप्टर से response विधि के अंदर 500 के जवाब में स्टेटस कोड बदलना
  • इंटरसेप्टर से response तरीके में response.resource बदलना या हटाना

आदर्श समाधान तब होगा जब सामान्य कॉलबैक नहीं कहा जाएगा, लेकिन इंटरसेप्टर से मेरे responseError विधि को इसके बजाय बुलाया जाएगा।

2
GwynBleidD 30 नवम्बर 2015, 13:21

2 जवाब

सबसे बढ़िया उत्तर

लेकिन मुझे स्थिति के साथ त्रुटि प्रतिक्रियाओं को संभालने में समस्या है। मैं सामान्य सफलता कॉलबैक (संसाधन उदाहरण से विधि में पारित) नहीं चाहता हूं जब त्रुटि होती है, तो मुझे एक वैश्विक त्रुटि हैंडलर चाहिए, लेकिन मैंने अभी तक काम नहीं किया है। हर बार प्रतिक्रिया कॉलबैक में दी जाती है। मैंने अब तक कोशिश की है:

इंटरसेप्टर से प्रतिक्रिया विधि में $ q.reject लौटाते हैं

ऐसी प्रतिक्रिया को अस्वीकार करने के लिए जिसे आप पसंद नहीं करते, throw का उपयोग करें:

function inteceptor(httpPromise) {
    var newPromise = (httpPromise
        .then(function(response) {
                  if (dontLike) {
                      throw response;
                  } else {
                      return response;
              },
              function (eResponse) {
                  if (iLike) {
                      return eResponse;
                  } else {
                      throw eResponse;
                  };
              })
     );
     return newPromise;
};

अपने इंटरसेप्टर से चेन करने के लिए

var chainedPromise = (interceptor(httpPromise)
    .then (function (response) {
         //render data
         return response;
    }).catch (function (error) {
         console.log(error);
         throw error;
    })
);
3
Community 20 जून 2020, 09:12

मैंने हल ढूंढ लिया है। मुझे लगता है कि ngResource मॉड्यूल में कुछ बग है।

इस तरह से कॉलबैक के लिए पंजीकृत होने पर:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}, function(result) {
    something...
});

कॉलबैक को रोकने के लिए केवल समाधान ngResource इंटरसेप्टर से त्रुटि फेंक रहा है। लेकिन जब वादा में पंजीकृत में कॉलबैक:

ApiMethod.query({'get_parameter': 1}, {'post_json': 2}).$promise.then(function(result) {
    something...
});

इंटरसेप्टर से $q.reject वापस आने से कॉलबैक को रोका जा सकता है।

सभी कॉलबैक को फिर से दर्ज करने से समस्या ठीक हो जाती है।

1
GwynBleidD 30 नवम्बर 2015, 12:16