سؤال

أنا أعمل على التطبيق المشرف مع أنغولارجس.التطبيق جلب البيانات الخاصة به من الخادم باستخدام resource الموارد.أنا في نهاية المطاف مع كائنات البيانات التي تحتوي على' promise وعد ' الملكية لتحديد متى تم جلب البيانات.كل شيء على ما يرام.

الآن ، يمكن لتطبيق المسؤول هذا أيضا إنشاء كائنات جديدة.تتم إدارة هذه الكائنات الجديدة من قبل نفس وحدات التحكم من تلك التي تأتي عادة من 'resource الموارد'.

حتى الآن لدي 2 نوع من الكائنات:

  • كائنات مع promise وعد الملكية.أنا يجب أن أستعمل promise وعد.ثم () قبل التلاعب بها مع البيانات الكاملة
  • كائنات عادية.ليس لديهم خاصية الوعد ، يمكن الوصول إلى قيمتها على الفور

أود تقليل الكود والحصول على حالة استخدام واحدة ، وعدم الاضطرار إلى التحقق مما إذا تم حل بيانات الكائن ، أو إذا لم يكن وعدا.

هل هناك أي مشكلة في بناء بلدي' عادي 'الكائنات عن طريق إضافتها' promise وعد ' الملكية التي تم حلها بالفعل لأنفسهم?بهذه الطريقة ، أود دائما استخدام ' ميوبجيكت.promise وعد.ثم ()'.

هل هناك أي نمط مشترك للتعامل مع هذا الوضع?لم أتمكن من العثور على أي طريقة 'القياسية' لإنشاء هذا النوع من الكائنات مع الزاوي.

هل كانت مفيدة؟

المحلول

يمكنك استخدام q ف. متى إذا لم تكن متأكدا مما إذا كان الكائن لديه وعد أم لا.

(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
          //handle success case.
          //Incase of object not having the $promise property result will be object itself
}) 

إذا لم يكن للخاصية الناتجة وعد ، فسيتم حل ذلك بالوعد.

يلتف كائن قد يكون قيمة أو (3 حزب) ثم قادرة على الوعد في promise ف وعد.يكون هذا مفيدا عندما تتعامل مع كائن قد يكون أو لا يكون وعدا ، أو إذا كان الوعد يأتي من مصدر لا يمكن الوثوق به.

لا تحتاج دائما إلى إنشاء وعد وإرفاقه بالبيانات التي يتم نقلها ، وبدلا من ذلك يمكنك جعل وعدك بإرجاع الطرق يساعدك على تنفيذ نمط الوعد وتجريد منطق الوعد على خدمتك نفسها.مثال:-

   function getCurrentUserData(userId){
       var defered = $q.defer();
       ... 
       //Check in my cache if this is already there, then get it from cache and resolve it
       defered.resolve(objectFromCache);
      //my else condition
      //It is not in cache so let me make the call.
      $http.get('myurl').then(function(result){
            //Do validation with data and if it doesnot match then reject it
            defered.reject(reason);
             //Else Do something with the data put it into the cache, mapping logic etc..
             defered.resolve(dto);


      }).catch(function(error){
            //do something with error and then reject
            defered.reject(reasonDerived);
      });
      return defered.promise;
   }

هنا هو نسخة مبسطة وأقل وضوحا (الائتمان:بنجامين جرونباوم):

var cached = null;
function getCurrentUserData(userId){
    return cached = cached || $http.get('myurl').then(function(result){
        if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
        return transformToDto(result);
    }, function(response){
     if(checkforsomethingonstatusandreject)
       return $q.reject('Errored Out')
     //do some actions to notify the error scenarios and return default actions
     return someDefaults; });
    }

يمكنك بالطبع return $q.reject(derivedReason) هنا بدلا من إعادة السبب وتحويله بناء على مزيد من الفحوصات ، فإن الفكرة هي تخزين الوعد مؤقتا بدلا من القيمة.هذا أيضا لديه ميزة عدم تقديم طلبات هتب متعددة إذا تم استدعاء الأسلوب قبل أن يعود مرة واحدة.

الآن يمكنك أن تفعل دائما:-

    getCurrentUserData(userid).then(function(user){

    }).catch(function(error){

    });

وعود يمكن بالسلاسل من خلال كذلك.لذلك يمكنك أيضا القيام بذلك:-

   return $resource('myresource').$promise.then(function(result){
          //Do some mapping and return mapped data
         return mappedResult;
    });

نصائح أخرى

وعود + يجب أن تقدم طريقة ثابتة:

giveacodicetagpre.

... الذي يولد وعد مسبق.يجب عليك إرجاع أحد هذه إذا كانت مكتبة الوعود الخاصة بك تقدم هذا.رائعة.أفعل هذا كثيرا لتجنب ازدواجية الواجهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top