مشكلات استخدام المؤجلة/عندما تكون في jquery لتأجيل وظيفة

StackOverflow https://stackoverflow.com//questions/25054809

سؤال

أنا حقًا أعاني من استخدام Deferred أو When مع برنامج jquery النصي الخاص بي.لقد قمت بالاطلاع على عدد من المقالات هنا وفي أماكن أخرى (بما في ذلك api.jquery.com) وأعتقد أنني مبتدئ جدًا بحيث لا أستطيع فهم كيفية استخدام هذه المكالمات بالضبط.

أحاول تأجيل تشغيل وظيفة ما حتى تكتمل وظيفة سابقة في البرنامج النصي الخاص بي.

أملك

function datapoints () {
    //My long function here where I define $data
};

والنتيجة هي مصفوفة تسمى $data.أحتاج إلى تحديد متغير البيانات $ أثناء الانتقال إلى وظيفتي التالية، لذلك أريد تأجيله.

لقد حاولت إعداد التأجيل مثل هذا:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );

سأكون ممتنًا حقًا لبعض المؤشرات حول كيفية تنظيف هذا.لقد حاولت إعادة إنشاء أمثلة مختلفة ولكن النتيجة في كل مرة هي خطأ في وحدة التحكم يفيد بأن $data غير محددة.أعلم أن الكود يعمل لأنه عندما أقوم يدويًا بوضع setTimeout لبضع ثوانٍ قبل تشغيل الوظيفة الثانية، كل شيء يعمل بشكل جيد ولكن أعتقد أن التأجيل هو الحل الأفضل.

شكرا لك مقدما!

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

المحلول

حاول إصلاح الكود الخاص بك مثل هذا:

deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);

سيضمن هذا أن البيانات التي تستخدمها هي في الواقع البيانات التي تم إرجاعها datapoints().

يجب عليك أيضًا أن تدرك أنه ما لم datapoints() هي وظيفة غير متزامنة، فالرمز الذي كتبته سوف يحظر سلسلة JS (على سبيل المثال.إذا تم تشغيله في المتصفح - فسيؤدي إلى حظر واجهة المستخدم).

الوعود/المؤجلة مع الوظائف المتزامنة ليست ذات فائدة كبيرة.

النمط المعتاد سيكون مثل هذا:

function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})

نصائح أخرى

جرب هذا الرمز:

giveacodicetagpre.

غير متأكد تماما من مشكلتك، ولكن هذه jsfiddle يعمل بشكل جيد بالنسبة لي.

giveacodicetagpre.

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