already ইতিমধ্যে প্রগতি ত্রুটিতে প্রয়োগ করুন


133

স্ট্যাক ট্রেস:

Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (file:///android_asset/www/built.min.js:7:22740)
at Object.Scope.$apply (file:///android_asset/www/built.min.js:7:25967)
at navigator.geolocation.getCurrentPosition.that (file:///android_asset/www/built.min.js:13:8670)
at Object.geolocation.getCurrentPosition (file:///android_asset/www/plugins/org.apache.cordova.core.geolocation/www/geolocation.js:122:13)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8589)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8277)
at Object.getCurrentCity (file:///android_asset/www/built.min.js:13:8941)
at Object.$scope.locateDevice (file:///android_asset/www/built.min.js:13:10480)
at file:///android_asset/www/built.min.js:7:12292:7

এই কোডটিকে বোঝায় http://pastebin.com/B9V6yvFu

    getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {

        navigator.geolocation.getCurrentPosition(function () {
            var that = this,
                args = arguments;

            if (onSuccess) {
                $rootScope.$apply(function () {
                    onSuccess.apply(that, args);
                });
            }
        }, function () {
            var that = this,
                args = arguments;
            if (onError) {
                $rootScope.$apply(function () {
                    onError.apply(that, args);
                });
            }
        }, {
            enableHighAccuracy: true,
            timeout: 20000,
            maximumAge: 18000000
        });
    })

আশ্চর্যের বিষয়, আমার LG4X এ এটি ঠিকঠাক কাজ করে, তবে আমার স্যামসং এস 2 এ এটি উপরের ত্রুটিটি ছুঁড়ে দেয়। কোন ধারণা কি ভুল?


1
আপনি কি স্ট্যাকওভারফ্লো . com/a/12859093/1266600 চেষ্টা করেছেন ? এটি হতে পারে কারণ বিভিন্ন ডিভাইস -> বিভিন্ন প্রক্রিয়াজাতকরণের গতি -> বিভিন্ন সময়, যা কিছু জায়গায় দ্বন্দ্ব সৃষ্টি করতে পারে তবে অন্যকে নয়।
sushain97

20
ব্যবহার$timeout()
ওনুর ইল্ড্রামম

7
$ সময়সীমা () মন্তব্যে +1 করুন। দেখুন: স্ট্যাকওভারফ্লো.com
ট্রেভর

উত্তর:


106

আপনি এই ত্রুটিটি পাচ্ছেন কারণ আপনি $applyএকটি বিদ্যমান হজম চক্রের ভিতরে কল করছেন ।

বড় প্রশ্নটি: আপনি কেন ফোন করছেন $apply? আপনি $applyকোনও অ-কৌণিক ইভেন্ট থেকে ইন্টারফেস না করা পর্যন্ত কখনও কল করার দরকার নেই । অস্তিত্বের $applyসাধারণত অর্থ হ'ল আমি কিছু ভুল করছি (যদি না,, প্রয়োগটি কোনও অ-কৌনিক ঘটনা থেকে ঘটে)।

যদি $applyএখানে সত্যিই উপযুক্ত হয় তবে একটি "নিরাপদ প্রয়োগ" পদ্ধতির ব্যবহার বিবেচনা করুন:

https://coderwall.com/p/ngisma


41
লিঙ্কযুক্ত নিরাপদ প্রয়োগের মূলটি হ'ল একটি অ্যান্টি-প্যাটার্ন (ডক্স অনুসারে) github.com/angular/angular.js/wiki/Anti-Patterns । যদি আপনি ভবিষ্যত-সমর্থিত ($$ পর্বটি চলে যাচ্ছে!) করার পদ্ধতিটি চান, আপনার কোডটি কোনও সময়সীমা ছাড়াই একটি $ টাইমআউট () এ মোড়ুন। বর্তমান ডাইজেস্ট চক্রটি সম্পূর্ণ হওয়ার পরে এটি নিরাপদে প্রয়োগ হবে।
বিটাবার্বাস্ট

@ বিটোরবাস্ট সম্মত নিরাপদ প্রয়োগ খারাপ। এছাড়াও, বহুবার প্রয়োগ কল করা পারফেক্ট সমস্যার কারণ হতে পারে। সমস্যাটি একসাথে এড়াতে কোডটি গঠন করা ভাল।
ব্রায়ান জেনিসিও

আমি আবেদন কল করছি না
সার্কিট্রি


41

আপনি এই বিবৃতি ব্যবহার করতে পারেন:

if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') {
    $scope.$apply();
}

1
Vari দিয়ে শুরু হওয়া ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দেওয়া হয় না কারণ তারা ব্যক্তিগত private এই ক্ষেত্রে $$ পর্ব
আরা ইয়েরেসিয়ান

9
এই উত্তরটি উপরের উত্তরটির চেয়ে অনেক বেশি সহায়ক। আমার একটি সমাধান দরকার, এমন কোনও কিছুর জন্য উপদেশ না দেওয়া যা আমার নিয়ন্ত্রণের বাইরে। আমাদের কৌণিক এবং লিগ্যাসি কোডের মিশ্রণ রয়েছে এবং তাদের কোনওরকম ইন্টারঅ্যাক্ট করতে হবে। সমস্ত লিগ্যাসি কোডটি কেবল নতুন করে লেখা খুব ব্যয়বহুল ...
জর্ডান ল্যাপ

24

যদি কিছু ক্ষেত্রে স্কোপ প্রয়োগ করা আবশ্যক, তবে আপনি একটি টাইমআউট সেট করতে পারেন যাতে $ প্রয়োগটি পরবর্তী টিক না হওয়া পর্যন্ত পিছিয়ে যায় $

setTimeout(function(){ scope.$apply(); });

অথবা আপনার কোডটি একটি $ সময়সীমা (ফাংশন () {..}) এ মোড়ানো; কারণ এটি স্বয়ংক্রিয়ভাবে কার্যকর হবে কার্যকর করার শেষে সুযোগটি। যদি আপনার একযোগে আচরণ করার জন্য আপনার ফাংশনটির প্রয়োজন হয় তবে আমি প্রথমটি করব।


আমি setTimeout(function() { $apply(function() {... do stuff ...} ) })নীচে @ তমিল ভেনধানের মধ্যে ক্রিয়াটি অন্তর্ভুক্ত করার দরকার পেয়েছি ।
প্রোটোটাইপ

6
সেটটাইমআউট ব্যবহার করবেন না, যা কেবলমাত্র আরেকটি প্রয়োগের প্রয়োজন তৈরি করে। ফ্রেমওয়ার্কটি ব্যবহার করুন, এটিতে একটি $ টাইমআউট পরিষেবা রয়েছে যা আপনার পক্ষে এটি করে।
স্পেনসার

10

আমার ক্ষেত্রে আমি $applyকিছু ইভেন্টের লিঙ্ক করতে কৌনিক ক্যালেন্ডার ইউআই ব্যবহার করি :

$scope.eventClick = function(event){           
    $scope.$apply( function() {
        $location.path('/event/' + event.id);
    });
};

সমস্যার ডকটি পড়ার পরে: https://docs.angularjs.org/error/ $ রুটস্কোপ / ইনগ্রোগ

অংশটি অসম্পূর্ণ API (সিঙ্ক / অ্যাসিঙ্ক) খুব আকর্ষণীয়:

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

যেহেতু, মাইকন্ট্রোলার কনস্ট্রাক্টর সর্বদা একটি $ প্রয়োগ কলের মধ্যে থেকেই তাত্ক্ষণিকভাবে থাকে, তাই আমাদের হ্যান্ডলারটি নতুনের মধ্যে enter প্রবেশ করার চেষ্টা করছে একের মধ্যে থেকেই প্রয়োগ ব্লক।

আমি কোডটি এতে পরিবর্তন করি:

$scope.eventClick = function(event){           
    $timeout(function() {
        $location.path('/event/' + event.id);
    }, 0);
};

একটি যাদুমন্ত্র মত কাজ করে !

এখানে আমরা ভবিষ্যতের কল স্ট্যাকের সুযোগগুলিতে পরিবর্তনগুলি নির্ধারণ করার জন্য $ টাইমআউট ব্যবহার করেছি। 0 এমএসের একটি সময়সীমা নির্ধারণের মাধ্যমে, এটি যত তাড়াতাড়ি সম্ভব ঘটবে এবং $ টাইমআউটটি নিশ্চিত করবে যে কোডটি একটি একক $ প্রয়োগ ব্লকে কল হবে।


1
আপনার $ সময়সীমা বিলম্ব 0 সমাধান দুর্দান্ত।
আহসান

9

কৌনিক 1.3 এ, আমি মনে করি, তারা একটি নতুন ফাংশন যুক্ত করেছে - $scope.$applyAsync()। এই ফাংশন কলগুলি পরে প্রয়োগ হয় - তারা কমপক্ষে 10 এমএস পরে বলে say এটি নিখুঁত নয়, তবে এটি কমপক্ষে বিরক্তিকর ত্রুটিটি দূর করে।

https://docs.angularjs.org/api/ng/type/ $ রুটস্কোপ.স্কোপ # $ প্রয়োগআসাইক


3

সময়ে যে কোনও সময়ে, কেবলমাত্র একটি $digestবা $applyঅগ্রগতিতে চলতে পারে। এটি আপনার অ্যাপ্লিকেশনটিতে প্রবেশের মাধ্যমে বাগগুলি সনাক্ত করা খুব শক্ত প্রতিরোধ করা। এই ত্রুটির স্ট্যাক ট্রেস আপনাকে বর্তমানে সম্পাদনকারী $applyবা এর উত্স সনাক্ত করতে দেয়$digest কলটির , যা ত্রুটির কারণ হয়েছিল।

আরও তথ্য: https://docs.angularjs.org/error/$rootScope/inprog?p0=$ প্রয়োগ করুন


2

কেবল এই সমস্যাটি সমাধান করুন resolved এটি এখানে নথিভুক্ত

আমি $rootScope.$applyএকই প্রবাহে দু'বার ফোন করছিলাম । আমি যা করেছি তা হ'ল পরিষেবা ফাংশনের সামগ্রীটি একটি দিয়ে মুড়িয়ে ফেলা হয়েছে setTimeout(func, 1)


1

আমি জানি এটি পুরানো প্রশ্ন তবে আপনার যদি সত্যই ব্যবহারের দরকার হয় তবে $ সুযোগ $ প্রয়োগআসেন্স ();


0

আমি $ সুযোগ।। কল করি $

      var callApplyTimeout = null;
      function callApply(callback) {
          if (!callback) callback = function () { };
          if (callApplyTimeout) $timeout.cancel(callApplyTimeout);

          callApplyTimeout = $timeout(function () {
              callback();
              $scope.$apply();
              var d = new Date();
              var m = d.getMilliseconds();
              console.log('$scope.$apply(); call ' + d.toString() + ' ' + m);
          }, 300);
      }

সহজভাবে কল করুন

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