কৌণিক সমস্যাটি কীভাবে সমাধান করবেন "10 $ ডাইজেস্ট () পুনরাবৃত্তিতে পৌঁছেছে" ত্রুটি


91

10 $ ডাইজেস্ট () পুনরাবৃত্তি পৌঁছেছে। বাতিল!

"শেষ ৫ টি পুনরাবৃত্তিতে নিক্ষেপ করা প্রহরীগুলি:" ইত্যাদির অর্থে প্রচুর সমর্থনকারী পাঠ্য রয়েছে, তবে এই পাঠ্যের অনেকগুলিই বিভিন্ন ফাংশনের জাভাস্ক্রিপ্ট কোড। এই সমস্যাটি নির্ণয়ের জন্য কি থাম্বের নিয়ম রয়েছে? এটি কি এমন সমস্যা যা সর্বদা হ্রাস করা যায়, বা এমন কোনও জটিল জটিল অ্যাপ্লিকেশন রয়েছে যা এই সমস্যাটিকে কেবল একটি সতর্কতা হিসাবে বিবেচনা করা উচিত?

উত্তর:


80

ভেন যেমন বলেছিলেন, আপনি প্রতিটি $digestচক্রের পৃথক (অভিন্ন নয়) বস্তুগুলি ফিরিয়ে দিচ্ছেন বা আপনি অনেকবার ডেটা পরিবর্তন করছেন।

আপনার অ্যাপের কোন অংশটি এই আচরণের কারণ ঘটছে তা নির্ধারণের দ্রুত সমাধান:

  1. সমস্ত সন্দেহজনক এইচটিএমএল সরান - মূলত টেমপ্লেট থেকে আপনার সমস্ত এইচটিএমএল সরিয়ে ফেলুন এবং কোনও সতর্কতা নেই কিনা তা পরীক্ষা করুন
  2. যদি কোনও সতর্কতা না থাকে - আপনি যে এইচটিএমএল সরিয়েছেন তার ছোট্ট অংশ যুক্ত করুন এবং সমস্যাটি ফিরে এসেছে কিনা তা পরীক্ষা করে দেখুন
  3. আপনি কোনও সতর্কতা না পাওয়া পর্যন্ত ২ য় ধাপ পুনরাবৃত্তি করুন - আপনার এইচটিএমএল এর কোন অংশটি সমস্যার জন্য দায়ী তা আপনি খুঁজে বের করবেন
  4. আরও তদন্ত করুন - তৃতীয় ধাপের অংশটি হ'ল বস্তুগুলিকে পরিবর্তনের জন্য দায়ী $scopeবা প্রতিটি $digestচক্রের অ-অভিন্ন বস্তুগুলি ফিরিয়ে দিচ্ছে ।
  5. আপনার যদি এখনও $digestধাপ 1 পরে পুনরাবৃত্তি সতর্কতা থাকে তবে আপনি সম্ভবত খুব সন্দেহজনক কিছু করছেন। প্যারেন্ট টেম্পলেট / স্কোপ / নিয়ামকের জন্য একই পদক্ষেপগুলি পুনরাবৃত্তি করুন

আপনি নিশ্চিত করতে চান যে আপনি নিজের কাস্টম ফিল্টারগুলির ইনপুট পরিবর্তন করছেন না

মনে রাখবেন, জাভাস্ক্রিপ্টে নির্দিষ্ট ধরণের অবজেক্ট রয়েছে যা আপনি সাধারণত আশা করেন এমন আচরণ করে না:

new Boolean(true) === new Boolean(true) // false
new Date(0) == new Date(0) // false
new String('a') == new String('a') // false
new Number(1) == new Number(1) // false
[] == [] // false
new Array == new Array // false
({})==({}) // false

4
ধন্যবাদ! এটি একটি সহায়ক হিউরিস্টিক। আমি আরও ভাবছি যে এনজিআরপিট-এর জন্য অ্যাঙ্গুলারের নতুন "ট্র্যাক বাই" বৈশিষ্ট্যটি আমাকেও সহায়তা করবে। আমি কোনও মানচিত্রে () এবং গ্রুপবি দ্বারা () স্ট্যান্ডে অ্যান্ডস্কোর ব্যবহার করে স্টাফ করছি, সুতরাং এটি অবশ্যই প্রতিবার "বিভিন্ন" অবজেক্টগুলি ফিরিয়ে দিচ্ছে (যদিও তারা যৌক্তিকভাবে একই জিনিসগুলির প্রতিনিধিত্ব করে - "আইডি দ্বারা ট্র্যাক" কৌনিকগুলি তাদের দেখতে না সহায়তা করবে "পরিবর্তন" হিসাবে যদি তারা সত্যিই না থাকে)।
ব্লাস্টার

4
আপনি করছেন তাহলে map()এবং groupBy()করতে কি নিশ্চিত চেয়ে আপনার $watchস্প্যানিশ ভাষায় দ্বারা মলিন পরীক্ষণ সঞ্চালন objectEquality $watch('myFunctionDoingGropby',callback,true) দেখুন docs.angularjs.org/api/ng.$rootScope.Scope#$watch
g00fy

উপরের মতামত অনুসারে, "ট্র্যাক বাই" আমার সমস্যাটি স্থির করেছে (ডকুমেন্টগুলি এখানে দেখুন: docs.angularjs.org/api/ng/directive/ngRepeat )। কেন এটি কাজ করে তা ব্যাখ্যা করে একটি ব্যাখ্যামূলক মন্তব্যের জন্য আমি কৃতজ্ঞ
হব

@ g00fy: এটি একটি ভাল নেতৃত্ব ছিল এবং আমি আমার তালিকাটি পুনরুদ্ধার ফাংশনটি পরিবর্তিত করতে সক্ষম হয়েছি আমার পরিবর্তকের সাথে একটি পরিবর্তনশীল $scopeযা _.mapএকবার তালিকাভুক্ত তালিকাটি অর্পণ করা হয়েছে - তবে সাধারণ ক্ষেত্রে আপনি কীভাবে অবজেক্টের সমতা অনুসারে নোংরা চেকিংকে প্রভাবিত করবেন যদি এটি একটি ম্যানুয়ালি তৈরি করা হয়নি $watchযা ট্রিপ আপ করছে, কিন্তু ngRepeat?
বা ম্যাপার 21

73

সাধারণত আপনি যখন প্রতিবার অন্য কোনও বস্তুর ফিরে আসেন তখন তা ঘটে।

উদাহরণস্বরূপ, আপনি যদি এটিতে এটি ব্যবহার করেন ng-repeat:

$scope.getObj = function () {
  return [{a: 1}, {b: 2}];
};

আপনি এই ত্রুটি বার্তাটি পেতে চলেছেন কারণ কৌণিক "স্থিতিশীলতা" রাখার চেষ্টা করে এবং 2 বার একই ফলাফল না ফেরানো পর্যন্ত ফাংশনটি সম্পাদন করবে (এর সাথে তুলনা করে) === ), যা আমাদের ক্ষেত্রে কখনই সত্য হবে না কারণ ফাংশন সর্বদা একটি প্রত্যাবর্তন করে নতুন বস্তু

console.log({} === {}); // false. Those are two different objects!

এই ক্ষেত্রে, আপনি সরাসরি স্কোপে অবজেক্টটি সংরক্ষণ করে এটি ঠিক করতে পারেন, যেমন

$scope.objData = [{a: 1}, {b: 2}];
$scope.getObj = function () {
  return $scope.objData;
};

আপনি সর্বদা একই জিনিস ফিরে আসছেন!

console.log($scope.objData === $scope.objData); // true (a bit obvious...)

(কখনও কখনও জটিল অ্যাপ্লিকেশনগুলিতেও আপনার এটির মুখোমুখি হওয়া উচিত নয়)।

আপডেট: কৌণিক তাদের ওয়েবসাইটে আরও কিছু গভীর-ব্যাখ্যা যুক্ত করেছে


কীভাবে আপনি এই ঘটতে বাধা দেন? এই মুহূর্তে আমারও একই অবস্থা হচ্ছে am
বিজয়ী

4
নিশ্চিত করুন যে আপনি প্রতিটি কলে পৃথক অবজেক্ট তৈরি করছেন না;)।
ভেন

আমি কীভাবে এটি নিশ্চিত করতে পারি? আমি আইটেমের মতো ফানক (আপত্তি) তে কিছু করছি, তবে মনে হয় একবার পছন্দ করার পরিবর্তে ফানকে অনেকবার ডাকা হবে। আমি ফানক কল করতে এনজি-আরএন ব্যবহার করার চেষ্টা করেছি এবং তারপরে এটিকে সুযোগের কোনও মডেলের সাথে সংযুক্ত করেছিলাম তবে এটি কার্যকর হয়নি।
বিজয়ী

4
এই সমস্যাটি আপনি যেখানেই দেখেন এটি উদাহরণ is অ্যাঙ্গুলার আপত্তিজনক ফাংশনটির দিকে ইঙ্গিত করতে পারলে এটি এত দুর্দান্ত হত, যে এই আচরণ করে ...
জর্ন

4
@ বেনহিলার এটি ২০১৩ সাল থেকে অবশ্যই উন্নত হয়েছে, হ্যাঁ: পি।
ভেন

11

এই সমাধানটি কেবল এখানে ফেলে দিতে চেয়েছিলেন, আশা করি এটি অন্যকে সহায়তা করবে। আমি এই পুনরাবৃত্তি সমস্যাটি পাচ্ছিলাম কারণ আমি উত্পন্ন সম্পত্তিটির উপরে পুনরাবৃত্তি করছিলাম যা প্রতিবারই এটির পরিবর্তে একটি নতুন অবজেক্ট তৈরি করছিল।

উত্পন্ন বস্তুটিকে প্রথমবার অনুরোধ করার পরে এটি ক্যাশে করে আমি স্থির করেছিলাম এবং তারপরে এটি উপস্থিত থাকলে সর্বদা ক্যাশে ফিরিয়ে আনা হয়। একটি নোংরা () পদ্ধতিও যুক্ত করা হয়েছিল, যা প্রয়োজন অনুসারে ক্যাশেড ফলাফলকে ধ্বংস করে দেয়।

আমার এরকম কিছু ছিল:

function MyObj() {
    var myObj = this;
    Object.defineProperty(myObj, "computedProperty" {
        get: function () {
            var retObj = {};

            return retObj;
        }
    });
}

এবং সমাধানটি এখানে প্রয়োগ করা হয়েছে:

function MyObj() {
    var myObj = this,
        _cached;
    Object.defineProperty(myObj, "computedProperty" {
        get: function () {
            if ( !_cached ) {
                _cached = {};
            }

            return _cached;
        }
    });

    myObj.dirty = function () {
        _cached = null;
    }
}

ওহে আমার Iশ্বর, আমি আপনাকে 10 টি উপস্থাপনা দিতে পারতাম। আপনি কেবল এমন একটি সমস্যার সমাধান করেছেন যা আমাকে প্রায় 3 ঘন্টা ধরে দেয়ালের বিরুদ্ধে মাথা ঘুরিয়েছিল। আমি তোমাকে ভালোবাসি!
জিএমএ

7

এটি একেবারে অসীম লুপ না হওয়ার সম্ভাবনাও রয়েছে। 10 পুনরাবৃত্তিগুলি কোনও পরিমাণের নিশ্চিততার সাথে এই সিদ্ধান্তে নেওয়ার জন্য পর্যাপ্ত পরিমাণে নয়। তাই বন্য-হংসের তাড়া করার আগে প্রথমে এই সম্ভাবনাটি উড়িয়ে দেওয়ার পরামর্শ দেওয়া যেতে পারে।

এটি করার সবচেয়ে সহজ পদ্ধতিটি হ'ল ডাইজেস্ট লুপের সংখ্যাকে আরও বড় সংখ্যায় বাড়িয়ে দিচ্ছে, যা module.configপদ্ধতিটি ব্যবহার করে $rootScopeProvider.digestTtl(limit)পদ্ধতিতে করা যেতে পারে । যদি infdigত্রুটি আর প্রদর্শিত হচ্ছে না আপনি কেবল কিছু পর্যাপ্ত জটিল আপডেট লজিক আছে।

আপনি (অর্থাত নতুন ডাইজেস্ট লুপ উপর নির্ভর না শুরু করার) ব্যবহার পুনরাবৃত্ত সমাধানের জন্য অনুসন্ধান করতে পারেন আপনি রিকার্সিভ ঘড়ির উপর নির্ভর ডেটা বা মতামত গড়ে তুলতে পারেন while, forবা Array.forEach। কখনও কখনও কাঠামোটি কেবলমাত্র খুব ঘৃণ্য হয় এবং এমনকি পুনরাবৃত্ত হয় না, সম্ভবত সীমা বাড়াতে ব্যতীত সেই ক্ষেত্রে খুব বেশি কিছু করার দরকার নেই।

ত্রুটি ডিবাগ করার আরেকটি পদ্ধতি হজম ডেটা দেখে। আপনি যদি JSON প্রিন্ট করেন তবে আপনি একটি অ্যারে পাবেন। প্রতিটি শীর্ষ স্তরের এন্ট্রি একটি পুনরাবৃত্তি প্রতিনিধিত্ব করে, প্রতিটি পুনরাবৃত্তি ঘড়ির এন্ট্রিগুলির একটি তালিকা নিয়ে গঠিত।

উদাহরণস্বরূপ, আপনার যদি এমন কোনও সম্পত্তি থাকে যা $watchনিজেই পরিবর্তিত হয় তবে এটি সহজেই মূল্য অপরিবর্তিত হয় তা দেখতে পাওয়া যায়:

$scope.vm.value1 = true;
$scope.$watch("vm.value1", function(newValue)
{
    $scope.vm.value1 = !newValue;
});
[
   [
      {
         "msg":"vm.value1",
         "newVal":true,
         "oldVal":false
      }
   ],
   [
      {
         "msg":"vm.value1",
         "newVal":false,
         "oldVal":true
      }
   ],
   [
      {
         "msg":"vm.value1",
         "newVal":true,
         "oldVal":false
      }
   ],
   [
      {
         "msg":"vm.value1",
         "newVal":false,
         "oldVal":true
      }
   ],
   [
      {
         "msg":"vm.value1",
         "newVal":true,
         "oldVal":false
      }
   ]
]

অবশ্যই বৃহত্তর প্রকল্পে এটি এতটা সহজ নাও হতে পারে, বিশেষত যেহেতু ঘড়ির কোনও ঘর্ষণ msgহয় "fn: regularInterceptedExpression"তবে ক্ষেত্রটির প্রায়শই মান থাকে {{ }}

সমস্যাটির উত্স খুঁজে পেতে এইচটিএমএল কেটে দেওয়ার মতো ইতিমধ্যে উল্লিখিত পদ্ধতিগুলি অবশ্যই সহায়ক।


6

আমার একই সমস্যা ছিল - আমি প্রতিবার একটি নতুন তারিখ তৈরি করছিলাম। সুতরাং তারিখের সাথে কারও কারও কাছে আমি এইভাবে সমস্ত কল রূপান্তরিত করেছি:

var date = new Date(); // typeof returns object

প্রতি:

var date = new Date().getTime(); // typeof returns number

তারিখের পরিবর্তে একটি সংখ্যা শুরু করা আমার পক্ষে এটি সমাধান করে।


2

সহজ উপায় হ'ল: কৌনিক.জে ব্যবহার করুন, মিনিট ফাইল নয়। এটি খুলুন এবং লাইনটি সন্ধান করুন:

if ((dirty || asyncQueue.length) && !(ttl--)) {

নীচে লাইন যুক্ত করুন:

console.log("aaaa",watch)

এবং তারপরে আপনার পৃষ্ঠাটি রিফ্রেশ করুন, বিকাশকারী সরঞ্জামগুলির কনসোলে আপনি ত্রুটি কোডটি পেয়ে যাবেন।


1

এটি একটি পরিচিত বাগ ui-router, এটি আমাদের সহায়তা করেছিল: https://github.com/angular-ui/ui-router/issues/600


এটি আমাকে প্রচুর সাহায্য করেছে! আপনার অবশ্যই এটি বিশদভাবে প্রকাশ করা উচিত এবং এই উত্তরটিতে থাকা কোডটি
লুলু

0

আমি আরও উল্লেখ করতে চাই যে আমি যখন আমার প্রকল্পে কাস্টম নির্দেশনার টেম্পলেট ইউআরএলটিতে টাইপ করি তখন আমি এই ত্রুটি বার্তাটি পেয়েছি। টাইপোর কারণে, টেমপ্লেটটি লোড করা যায়নি।

/* @ngInject */
function topNav() {
    var directive = {
        bindToController: true,
        controller: TopNavController,
        controllerAs: 'vm',
        restrict: 'EA',
        scope: {
            'navline': '=',
            'sign': '='
        },
        templateUrl: 'app/shared/layout/top-navTHIS-IS-A-TYPO.html'
    };

আপনার ওয়েব ব্রাউজারের ডেভ সরঞ্জামগুলির নেটওয়ার্ক ট্যাবটি দেখুন এবং কোনও উত্সে 404 ত্রুটি রয়েছে কিনা তা দেখুন।

উপেক্ষা করা সহজ, কারণ ত্রুটি বার্তাটি খুব ক্রিপ্টিক এবং আপাতদৃষ্টিতে বাস্তব সমস্যার সাথে সম্পর্কিত নয়।


0

আমার প্রকল্পে আমার এই সমস্যাটি ছিল কারণ অন্যদিকে () আমার রুটের সংজ্ঞাটি হারিয়েছিল এবং আমি ভুল রুটটিকে আঘাত করছিলাম।


0

আমার এই সমস্যাটি ছিল কারণ আমি এটি করছিলাম

var variableExpense = this.lodash.find(product.variableExpenseList, (ve) => {
               return ve.rawMaterial.id = rawMaterial.id;
});

এর পরিবর্তে: (বিজ্ঞপ্তি = বনাম ===), আমার ইউনিট পরীক্ষাটি বিরতি শুরু হয়েছিল এবং আমি আমার বোকামি খুঁজে পেয়েছি

var variableExpense = this.lodash.find(product.variableExpenseList, (ve) => {
               return ve.rawMaterial.id === rawMaterial.id;
});

0

আমি এই ইস্যুতে ছুটে এসেছি যেখানে আমার একটি গতিশীল সরঞ্জামদণ্ডের প্রয়োজন ছিল ... এটি কৌণিক কারণে প্রতিবারই এটি একটি নতুন মান হিসাবে (যদিও এটি একই ছিল) পুনরায় গণনা করে। আমি যেমন গণনা মান ক্যাশে একটি ফাংশন তৈরি:

$ctrl.myObj = {
    Title: 'my title',
    A: 'first part of dynamic toolip',
    B: 'second part of dynamic tooltip',
    C: 'some other value',
    getTooltip: function () {
        // cache the tooltip
        var obj = this;
        var tooltip = '<strong>A: </strong>' + obj.A + '<br><strong>B: </strong>' + obj.B;
        var $tooltip = {
            raw: tooltip,
            trusted: $sce.trustAsHtml(tooltip)
        };
        if (!obj.$tooltip) obj.$tooltip = $tooltip;
        else if (obj.$tooltip.raw !== tooltip) obj.$tooltip = $tooltip;
        return obj.$tooltip;
    }
};

তারপরে এইচটিএমএল এ, আমি এটি এটির মতো ব্যবহার করেছি:

<input type="text" ng-model="$ctrl.myObj.C" uib-tooltip-html="$ctrl.myObj.getTooltip().trusted">

0

এইভাবেই আমি এটির কাছে গিয়ে সমাধান খুঁজে পেলাম: আমি পাঠ্যটি যাচাই করেছি, এটি দেখিয়েছে:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

প্রহরীগণ সর্বশেষ 5 টি পুনরাবৃত্তিতে গুলি চালিয়েছিল: [[{"msg": "বিবৃতি === স্ট্যাটমেন্ট এবং& ফাংশন কল ()", "নতুনওয়াল": [id "আইডি": 7287, "রেফারেন ...

সুতরাং আপনি যদি দেখতে পারেন

*

ত্রুটি উত্পন্ন এই স্টেটমেন্ট। এই বার্তায় ডাকা ফাংশনটি আমি চেক করেছি, কোনটির সমস্যা আছে তা নির্ধারণ করার জন্য আমি তাদের সকলের কাছ থেকে (মিথ্যা) ফিরে এসেছি। তাদের একজন ফাংশন ডেকেছিলেন যা রিটার্ন পরিবর্তন করে রাখে, যা সমস্যা।


-3

যতটা পাগল শোনাচ্ছে ততই হঠাৎ হ'ল আমার ব্রাউজারটি পুনরায় চালু করে এই ত্রুটিটি ঠিক করেছি it

সুতরাং একটি সমাধান হ'ল কেবল আপনার ব্রাউজারের ক্যাশে সাফ করা বা ব্রাউজারটি পুনরায় চালু করার চেষ্টা করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.