كيف يمكنني إرفاق ردي اتصال منفصلين بـ Twisted المؤجل، بحيث يتم إطلاقهما بعد أن تكون النتيجة جاهزة؟

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

  •  21-12-2019
  •  | 
  •  

سؤال

ليس لدي خبرة كبيرة مع Twisted، ولكن هذا ما أفهمه حتى الآن.
عندما أقوم بإجراء استعلام في قاعدة البيانات مثل:

db = database.veryLongQuery(sql, binds)

يمكنني إضافة عمليات الاسترجاعات لفعل شيء ما بالنتيجة،

db.addCallback(lambda res: dispalyResult(res))

بخلاف ذلك، إذا كنت بحاجة إلى القيام بأشياء متعددة للحصول على نفس النتيجة، فيمكنني إنشاء طريقة:

def doTwoThings(self, res):
    self.d1 = anotherDeferred(res) # write to table A, return lastRowId
    self.d2 = yetAnotherDeferred(res) # write to table B, return lastRowId
    return d1

وأرفق ذلك به db (كرد الاتصال الأول)

db.addCallback(self.doTwoThings)

ومع ذلك، أود أن يكون هناك إشارة إلى d1 و d2 منذ البداية، في نفس الوقت الذي تم فيه إنشاء قاعدة البيانات، حيث ستحدث أحداث أخرى وأحتاج إلى إضافة عمليات رد اتصال إلى d1 و d2.

كيف يمكنني ربط سلسلتي رد اتصال منفصلتين (أو أكثر) بنفس السلسلة المؤجلة، db, ، لذا فهو "ينقسم"، ويتم إطلاق كلاهما جنبًا إلى جنب بمجرد أن تصبح النتيجة جاهزة؟

بهذه الطريقة يمكنني تتبع كل تأجيل من البداية والوصول إليه عند الضرورة.

أم أن هناك طريقة للإنشاء d1 و d2 منذ البداية، حتى أتمكن من الوصول إلى تلك الأسماء؟

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

المحلول

يمكنك استخدام شيء مثل هذا:

def splitResults(d1, d2):
    def splitter(val):
        # Pass val to d2 chain
        d2.callback(val)
        # Return val into d1's chain
        return val

    def splitterError(err):
        d2.errback(err)
    d1.addCallbacks(splitter, splitterError)

لذلك، عندما يحصل d1 على نتيجة، فإنه سيمررها إلى d2 أيضًا.

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