كيف يمكنني إرفاق ردي اتصال منفصلين بـ Twisted المؤجل، بحيث يتم إطلاقهما بعد أن تكون النتيجة جاهزة؟
-
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 أيضًا.