
ثوك هو:
هذا الملف التمهيدي (README) هو عمل قيد التقدم. يمكنك أيضًا أن تسألني سؤالاً على تويتر.
$ npm i thwackأو
$ yarn add thwack كان Axios رائعًا عندما تم إصداره في ذلك اليوم. لقد أعطانا برنامج تضمين قائم على الوعد حول XMLHttpRequest ، والذي كان من الصعب استخدامه. لكن ذلك كان منذ وقت طويل وتغير الزمن، وأصبحت المتصفحات أكثر ذكاءً. ربما حان الوقت لمواكبة حلول جلب البيانات الخاصة بك؟
تم إنشاء Thwack من الألف إلى الياء مع وضع المتصفحات الحديثة في الاعتبار. ولهذا السبب، فهي لا تحتوي على الأمتعة التي تمتلكها Axios. يبلغ وزن Axios حوالي 5 كيلو بايت مضغوطة. من ناحية أخرى، فإن Thwack هو نحيف يصل إلى 1.5 كيلو تقريبًا.
وهي تدعم نفس واجهة برمجة التطبيقات (API)، ولكن هناك بعض الاختلافات - بشكل أساسي حول options - ولكن في الغالب، يجب أن تكون قابلة للاستخدام بالتبادل للعديد من التطبيقات.
لا يحاول Thwack حل كل مشكلة، كما يفعل Axios، ولكنه بدلاً من ذلك يوفر الحل لـ 98% مما يحتاجه المستخدمون حقًا . وهذا ما يمنح Thwack بصمته الخفيفة كالريشة.
اخدش ذلك. يوفر Thwack نفس مستوى القوة الذي توفره Axios مع مساحة أصغر بكثير. ونظام الأحداث القائم على الوعد الخاص بـ Thwack أسهل في الاستخدام.
تتوفر الطرق التالية في كافة مثيلات Thwack.
thwack(url: string [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.request(options: ThwackOptions): Promise<ThwackResponse>
thwack.get(url: string [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.delete(url: string [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.head(url: string [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.post(url: string, data:any [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.put(url: string, data:any [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.patch(url: string, data:any [,options: ThwackOptions]): Promise<ThwackResponse>;
thwack.create(options: ThwackOptions): ThwackInstance;
تقوم طريقة create بإنشاء (da!) مثيل فرعي جديد لمثيل Thwack الحالي مع options المحددة.
thwack.getUri(options: ThwackOptions): string;
دقة عنوان URL لـ Thwacks متوافقة مع RFC-3986. أكسيوس ليس كذلك. إنه مدعوم من @thwack/resolve .
يدعم Thwack أنواع الأحداث التالية: request response data error .
لمزيد من المعلومات حول نظام أحداث Thwack، راجع أحداث Thwack أدناه.
thwack.addEventListener(type: string, callback: (event:ThwackEvent) => Promise<any> ): void;
thwack.removeEventListener(type: string, callback: (event:ThwackEvent) => Promise<any> ): void;
يحتوي Thwack على الوظائف المساعدة التالية لتقديم الطلبات المتزامنة. هم في الغالب من أجل التوافق مع Axios. راجع قسم "الكيفية" أدناه للحصول على مثال الاستخدام.
thwack.all(Promise<ThwackResponse>[])
thwack.spread(callback<results>)
تحتوي وسيطة options على الخصائص التالية.
urlوهذا إما عنوان URL مؤهل بالكامل أو عنوان URL نسبي.
baseURL يحدد عنوان URL الأساسي الذي سيتم استخدامه لإنشاء عنوان URL مؤهل بالكامل من url أعلاه. يجب أن يكون عنوان URL مطلقًا أو undefined . الافتراضي هو origin + pathname لصفحة الويب الحالية إذا كانت تعمل في متصفح أو undefined على Node أو React Native.
على سبيل المثال، إذا فعلت هذا:
thwack ( 'foo' , {
baseURL : 'http://example.com' ,
} ) ;سيكون عنوان URL الذي تم جلبه هو:
http://example.com/foo
method سلسلة تحتوي على إحدى طرق HTTP التالية: get أو post أو put أو patch أو delete أو head .
data إذا كانت method هي post أو put أو patch ، فهذه هي البيانات التي سيتم استخدامها لبناء نص الطلب.
headersهذا هو المكان الذي يمكنك فيه وضع أي رؤوس طلب HTTP اختيارية. يتم دمج أي رأس تحدده هنا مع أي قيم رأس مثيلة.
على سبيل المثال، إذا قمنا بتعيين مثيل Thwack مثل هذا:
const api = thwack . create ( {
headers : {
'x-app-name' : 'My Awesome App' ,
} ,
} ) ;ثم لاحقًا، عند استخدام المثيل، يمكنك إجراء مكالمة مثل هذا:
const { data } = await api . get ( 'foo' , {
headers : {
'some-other-header' : 'My Awesome App' ,
} ,
} ) ;العناوين التي سيتم إرسالها هي:
x-app-name: My Awesome App
some-other-header': 'My Awesome App'
defaultsيتيح لك هذا قراءة/تعيين الخيارات الافتراضية لهذا المثيل، وفي الواقع، أي مثيلات فرعية.
مثال:
thwack . defaults . baseURL = 'https://example.com/api' ; على سبيل المثال، defaults هي نفس الكائن الذي تم تمريره create . على سبيل المثال، سيتم إخراج ما يلي "https://example.com/api".
const instance = thwack . create ( {
baseURL : 'https://example.com/api' ,
} ) ;
console . log ( instance . defaults . baseURL ) ; لاحظ أيضًا أن تعيين الإعدادات defaults لمثيل (أو حتى تمرير options ) إلى مثيل لا يؤثر على الأصل. لذا، بالنسبة للمثال التالي، سيظل thwack.defaults.baseURL هو "https://api1.example.net/".
thwack . defaults . baseURL = 'https://api1.example.net/' ;
const instance = thwack . create ( ) ;
instance . defaults . baseURL = 'https://example.com/api' ;
console . log ( thwack . defaults . baseURL ) ;params هذا كائن اختياري يحتوي على أزواج المفتاح/القيمة التي سيتم استخدامها لإنشاء عنوان URL للجلب. في حالة وجود أي أجزاء :key baseURL أو url ، فسيتم استبدالها بقيمة المفتاح المطابق. على سبيل المثال، إذا فعلت هذا:
thwack ( 'orders/:id' , {
params : { id : 123 } ,
baseURL : 'http://example.com' ,
} ) ;سيكون عنوان URL الذي تم جلبه هو:
http://example.com/orders/123
إذا لم تحدد :name ، أو كان هناك param أكبر من المعلمات مقارنة بـ :name s، فسيتم تعيين المفاتيح/القيم المتبقية كمعلمات بحث (على سبيل المثال ?key=value ).
maxDepth الحد الأقصى لمستوى الطلبات العودية التي يمكن إجراؤها في callbck قبل أن يلقي Thwack خطأً. يتم استخدام هذا لمنع رد اتصال الحدث من التسبب في حلقة متكررة، وذلك إذا أصدر request آخر دون وجود ضمانات مناسبة. الافتراضي = 3.
responseType افتراضيًا، سيحدد Thwack تلقائيًا كيفية فك تشفير بيانات الاستجابة بناءً على قيمة content-type رأس الاستجابة. ومع ذلك، إذا استجاب الخادم بقيمة غير صحيحة، فيمكنك تجاوز المحلل اللغوي عن طريق تعيين responseType . القيم الصالحة هي arraybuffer و document (أي formdata ) و json و text و stream و blob . الإعدادات الافتراضية إلى تلقائية.
ما يتم إرجاعه بواسطة Thwack يتم تحديده من خلال الجدول التالي. عمود "طريقة الجلب" هو ما يتم حله في data . إذا لم تحدد responseType ، فسيقوم Thwack تلقائيًا بتحديد طريقة الجلب بناءً على content-type وجدول responseParserMap (انظر أدناه).
| نوع المحتوى | responseType | طريقة fetch |
|---|---|---|
application/json | json | response.json() |
multipart/form-data | formdata | response.formData() |
text/event-stream | stream | يقوم بتمرير response.body data بدون معالجة |
blob | response.blob() | |
arraybuffer | response.arrayBuffer() | |
*/* | text | response.text() |
ملحوظة:
streamغير مدعوم حاليًا في React Native بسبب #27741
responseParserMap هناك طريقة أخرى مفيدة لتحديد محلل الاستجابة الذي يجب استخدامه باستخدام responseParserMap . يسمح لك بإعداد تعيين بين content-type الناتج من رأس الاستجابة ونوع المحلل اللغوي.
يستخدم Thwack الخريطة التالية كخريطة افتراضية، والتي تسمح بفك تشفير بيانات json و formdata . إذا لم تكن هناك أي تطابقات، فإن محلل الاستجابة الافتراضي هو text . يمكنك تحديد الإعداد الافتراضي عن طريق تعيين مفتاح */* الخاص.
{
"application/json" : " json " ,
"multipart/form-data" : " formdata " ,
"*/*" : " text "
} ; يتم دمج أي قيمة تحددها في responseParserMap في الخريطة الافتراضية. وهذا يعني أنه يمكنك تجاوز الإعدادات الافتراضية و/أو إضافة قيم جديدة.
لنفترض، على سبيل المثال، أنك ترغب في تنزيل صورة إلى فقاعة. يمكنك تعيين baseURL إلى نقطة نهاية واجهة برمجة التطبيقات (API) الخاصة بك و responseParserMap الذي سيقوم بتنزيل الصور من أي نوع ككائنات نقطية كبيرة الحجم، ولكنه سيظل يسمح بتنزيلات json (حيث أن هذا هو الإعداد الافتراضي content-type: application/json ).
import thwack from 'thwack' ;
thwack . defaults . responseParserMap = { 'image/*' : 'blob' } ; سيتم تحليل أي عنوان URL تقوم بتنزيله باستخدام نوع محتوى image/* (على سبيل المثال image/jpeg ، image/png ، وما إلى ذلك) باستخدام محلل البيانات blob .
const getBlobUrl = async ( url ) => {
const blob = ( await thwack . get ( url ) ) . data ;
const objectURL = URL . createObjectURL ( blob ) ;
return objectURL ;
} ;شاهد هذا المثال الذي يعمل على CodeSandbox.
لاحظ أنه يمكنك استخدام هذه التقنية لأشياء أخرى غير الصور.
كما ترون، يعد استخدام responseParserMap طريقة رائعة للتخلص من الحاجة إلى تعيين responseType لاستدعاءات Thwack المختلفة.
validateStatus يتم استخدام هذه الوظيفة الاختيارية لتحديد رموز الحالة التي يستخدمها Thwack لإرجاع وعد أو رمي. يتم تمرير status الاستجابة. فإذا عادت هذه الدالة صادقا، انقضى الوعد، وإلا رفض الوعد.
تعرض الوظيفة الافتراضية أي حالة ليست في 2xx (أي 200-299)
paramsSerializer هذه وظيفة اختيارية سوف يستدعيها Thwack لإجراء تسلسل params . على سبيل المثال، بالنظر إلى الكائن {a:1, b:2, foo: 'bar'} ، يجب إجراء تسلسل له إلى السلسلة a=1&b=2&foo=bar .
بالنسبة لمعظم الأشخاص، يجب أن يعمل المُسلسل الافتراضي بشكل جيد. هذا مخصص بشكل أساسي لحالة الحافة وتوافق Axios.
لاحظ أن المُسلسل الافتراضي يقوم بترتيب المعلمات أبجديًا، وهي ممارسة جيدة يجب اتباعها. ومع ذلك، إذا لم يكن هذا مناسبًا لموقفك، فيمكنك إنشاء برنامج التسلسل الخاص بك.
resolver هذه هي الوظيفة التي يمكنك توفيرها لتجاوز سلوك المحلل الافتراضي. يأخذ resolver وسيطتين: url و baseURL الذي يجب أن يكون غير محدد، أو عنوان URL مطلق. يجب أن يكون هناك سبب وجيه لاستبدال وحدة الحل، ولكن هذه هي فتحة الهروب الخاصة بك في حالة الحاجة إلى ذلك.
status number يمثل رموز حالة HTTP المكونة من 3 أرقام والتي تم استلامها.
ok القيمة boolean التي تم تعيينها على true هي رمز status الموجود في النطاق 2xx (أي نجاح). لا تتأثر هذه القيمة بـ validateStatus .
statusText string تمثل نص رمز status . يجب عليك استخدام رمز status (أو ok ) في أي منطق برنامج.
headersكائن مفتاح/قيمة مع رؤوس HTTP التي تم إرجاعها. سيتم دمج أي رؤوس مكررة في رأس واحد مفصول بفواصل منقوطة.
data سيحتفظ هذا بالنص الذي تم إرجاعه لاستجابة HTTP بعد أن يتم دفقه وتحويله. الاستثناء الوحيد هو إذا استخدمت responseType stream ، وفي هذه الحالة يتم تعيين data مباشرة إلى عنصر body .
إذا تم طرح خطأ ThwackResponseError ، فستكون data عبارة عن نص عادي يمثل نص الاستجابة.
options كائن options الكاملة الذي قام بمعالجة الطلب. سيتم دمج هذه options بالكامل مع أي مثيل (مثيلات) أصل، وكذلك مع defaults .
response كائن Response HTTP الكامل كما تم إرجاعه عن طريق fetch أو response من رد اتصال حدث اصطناعي.
إذا كانت الاستجابة من طلب Thwack تؤدي إلى رمز status غير 2xx (على سبيل المثال، 404 لم يتم العثور عليه)، فسيتم طرح خطأ ThwackResponseError .
ملاحظة: من الممكن أن يتم طرح أنواع أخرى من الأخطاء (على سبيل المثال، رد اتصال مستمع حدث سيء)، لذلك من الأفضل التحقق من الخطأ الذي تم اكتشافه لمعرفة ما إذا كان من النوع
ThwackResponseError.
try {
const { data } = await thwack . get ( someUrl )
} catch ( ex ) {
if ( ex instanceof thwack . ThwackResponseError )
const { status , message } = ex ;
console . log ( `Thwack status ${ status } : ${ message } ` ) ;
} else {
throw ex ; // If not, rethrow the error
}
} يحتوي ThwackResponseError على جميع خصائص Error JavaScript العادي بالإضافة إلى خاصية thwackResponse التي لها نفس خصائص حالة النجاح.
تعتمد المثيلات التي تم إنشاؤها في Thwack على المثيل الأصلي. تنتقل الخيارات الافتراضية لأحد الوالدين عبر المثيلات. يمكن أن يكون هذا مفيدًا لإعداد الخيارات في الوالدين والتي يمكن أن تؤثر على الأطفال، مثل baseURL ،
وعلى العكس من ذلك، يمكن للوالدين استخدام addEventListener لمراقبة أطفالهم (راجع كيفية تسجيل كل استدعاء لواجهة برمجة التطبيقات أدناه للحصول على مثال على ذلك).

إلى جانب الحالات، فإن نظام أحداث Thwack هو ما يجعل Thwack قويًا للغاية. مع ذلك، يمكنك الاستماع لأحداث مختلفة.
هنا هو تدفق الحدث لجميع الأحداث. كما ترون، من الممكن أن يدخل الكود الخاص بك في حلقة لا نهاية لها، إذا أصدر رد الاتصال الخاص بك request() بشكل أعمى دون التحقق مما إذا كان قد تم ذلك بالفعل، لذا كن حذرًا.

request عندما يستدعي أي جزء من التطبيق إحدى طرق جلب البيانات، يتم تشغيل حدث request . سيحصل أي مستمع على كائن ThwackRequestEvent الذي يحتوي على options الاستدعاء في event.options . يمكن لمستمعي الأحداث القيام بشيء بسيط مثل (تسجيل الحدث) أو معقد مثل منع الطلب وإرجاع الاستجابة باستخدام (بيانات وهمية)
// callback will be called for every request made in Thwack
thwack . addEventListener ( 'request' , callback ) ;لاحظ أن عمليات رد الاتصال يمكن أن تكون
asyncمما يسمح لك بتأجيل Thwack بحيث يمكنك، على سبيل المثال، الخروج وجلب البيانات بعنوان URL مختلف قبل المتابعة.
response يتم إطلاق الحدث بعد تلقي رؤوس HTTP، ولكن قبل دفق النص وتحليله. سيتلقى المستمعون كائن ThwackResponseEvent مع تعيين مفتاح thwackResponse على الاستجابة.
data يتم إطلاق الحدث بعد دفق النص وتحليله. يتم تشغيله فقط إذا أعاد الجلب رمز الحالة 2xx. سيتلقى المستمعون كائن ThwackDataEvent مع تعيين مفتاح thwackResponse على الاستجابة.
error يتم إطلاق الحدث بعد دفق النص وتحليله. يتم تشغيله إذا أعاد الجلب رمز حالة غير 2xx. سيتلقى المستمعون كائن ThwackErrorEvent مع تعيين مفتاح thwackResponse على الاستجابة.
سيعمل Thwack على NodeJS، لكنه يتطلب تعبئة متعددة لـ window.fetch . لحسن الحظ، هناك ملف polyfill رائع يسمى node-fetch يمكنك استخدامه.
إذا كنت تستخدم الإصدار 10 من NodeJS، فستحتاج أيضًا إلى تعبئة متعددة لـ Array#flat و Object#fromEntries . يحتوي الإصدار 11+ من NodeJS على هذه الطرق ولا يتطلب تعبئة متعددة.
يمكنك إما توفير هذه الحشوات المتعددة بنفسك، أو استخدام إحدى الواردات الملائمة التالية بدلاً من ذلك. إذا كنت تستخدم NodeJS 11+، فاستخدم:
import thwack from 'thwack/node' ; // NodeJS version 12+إذا كنت تعمل على NodeJS 10، فاستخدم:
import thwack from 'thwack/node10' ; // NodeJS version 10 إذا كنت ترغب في توفير عمليات التعبئة المتعددة هذه بنفسك، لاستخدام Thwack، يجب عليك الاستيراد من thwack/core وتعيين fetch كإعداد افتراضي fetch على هذا النحو.
import thwack from 'thwack/code' ;
thwack . defaults . fetch = global . fetch ; يجب أن يتم ذلك في رمز بدء تشغيل تطبيقك، وعادة ما يكون index.js .
ملاحظة:
responseTypeblobغير مدعوم في NodeJS.
Thwack متوافق مع React Native ولا يحتاج إلى عمليات تعبئة إضافية. انظر أدناه للحصول على نموذج تطبيق مكتوب بلغة React Native.
ملحوظة: React Native لا يدعم
streamبسبب #27741
يمكنك استخدام thwack.all() و thwack.spread() لتقديم طلبات متزامنة. يتم بعد ذلك تقديم البيانات إلى رد الاتصال الخاص بك كمصفوفة واحدة.
نعرض هنا معلومات لاثنين من مستخدمي GitHub.
function displayGitHubUsers ( ) {
return thwack
. all ( [
thwack . get ( 'https://api.github.com/users/donavon' ) ,
thwack . get ( 'https://api.github.com/users/revelcw' ) ,
] )
. then (
thwack . spread ( ( ... results ) => {
const output = results
. map (
( { data } ) => ` ${ data . login } has ${ data . public_repos } public repos`
)
. join ( 'n' ) ;
console . log ( output ) ;
} )
) ;
} لاحظ أن هذه مجرد وظائف مساعدة. إذا كنت تستخدم async / await ، فيمكنك كتابة هذا بدون مساعدي Thwack باستخدام Promise.all .
async function displayGitHubUsers ( ) {
const results = await Promise . all ( [
thwack . get ( 'https://api.github.com/users/donavon' ) ,
thwack . get ( 'https://api.github.com/users/revelcw' ) ,
] ) ;
const output = results
. map ( ( { data } ) => ` ${ data . login } has ${ data . public_repos } public repos` )
. join ( 'n' ) ;
console . log ( output ) ;
}يمكنك رؤية هذا قيد التشغيل مباشرة في CodeSandbox.
(عرض توضيحي مستوحى من هذا المنشور الفقاعي على axios/fetch)
استخدم AbortController لإلغاء الطلبات عن طريق تمرير signal في خيارات thwack .
في المتصفح، يمكنك استخدام AbortController المدمج.
import thwack from 'thwack' ;
const controller = new AbortController ( ) ;
const { signal } = controller ;
thwack ( url , { signal } ) . then ( handleResponse ) . catch ( handleError ) ;
controller . abort ( ) ;في NodeJS، يمكنك استخدام شيء مثل وحدة تحكم الإجهاض.
import thwack from 'thwack' ;
import AbortController from 'abort-controller' ;
const controller = new AbortController ( ) ;
const { signal } = controller ;
thwack ( url , { signal } ) . then ( handleResponse ) . catch ( handleError ) ;
controller . abort ( ) ; في حالة رغبتك في تنفيذ بعض الإجراءات عند إلغاء الطلب، يمكنك الاستماع إلى حدث abort عند signal أيضًا:
signal . addEventListener ( 'abort' , handleAbort ) ; أضف addEventListener('request', callback) وقم بتسجيل كل طلب إلى وحدة التحكم.
import thwack from 'thwack' ;
thwack . addEventListener ( 'request' , ( event ) => {
console . log ( 'hitting URL' , thwack . getUri ( event . options ) ) ;
} ) ;إذا كنت تستخدم React، فإليك خطافًا يمكنك "استخدامه" في تطبيقك والذي سيحقق نفس الشيء.
import { useEffect } from 'react' ;
import thwack from 'thwack' ;
const logUrl = ( event ) => {
const { options } = event ;
const fullyQualifiedUrl = thwack . getUri ( options ) ;
console . log ( `hitting ${ fullyQualifiedUrl } ` ) ;
} ;
const useThwackLogger = ( ) => {
useEffect ( ( ) => {
thwack . addEventListener ( 'request' , logUrl ) ;
return ( ) => thwack . removeEventListener ( 'request' , logUrl ) ;
} , [ ] ) ;
} ;
export default useThwackLogger ;فيما يلي مقتطف من التعليمات البرمجية حول كيفية استخدامه.
const App = ( ) = {
useThwackLogger ( )
return (
< div >
...
</ div >
)
} لنفترض أن لديك تطبيقًا قدم طلبًا لبعض بيانات المستخدم. إذا كان التطبيق يصل إلى عنوان URL محدد (على سبيل المثال، users ) ويستفسر عن معرف مستخدم معين (على سبيل المثال 123 )، فإنك ترغب في منع الطلب من الوصول إلى الخادم والاستهزاء بالنتائج بدلاً من ذلك.
status الافتراضية في ThwackResponse هي 200، لذلك ما لم تكن بحاجة إلى الاستهزاء باستجابة غير موافق، فستحتاج فقط إلى إرجاع data .
thwack . addEventListener ( 'request' , async ( event ) => {
const { options } = event ;
if ( options . url === 'users' && options . params . id === 123 ) {
// tells Thwack to use the returned value instead of handling the event itself
event . preventDefault ( ) ;
// stop other listeners (if any) from further processing
event . stopPropagation ( ) ;
// because we called `preventDefault` above, the caller's request
// will be resolved to this `ThwackResponse` (defaults to status of 200 and ok)
return new thwack . ThwackResponse (
{
data : {
name : 'Fake Username' ,
email : '[email protected]' ,
} ,
} ,
options
) ;
}
} ) ; غالبًا ما يكون من المرغوب فيه تحويل DTO (كائن نقل البيانات) إلى شيء يسهل على العميل استهلاكه. في هذا المثال أدناه، نقوم بتحويل DTO معقد إلى firstName lastName avatar والبريد email . يتم تجاهل عناصر البيانات الأخرى التي يتم إرجاعها من استدعاء API، ولكن لا تحتاج إليها التطبيقات.
يمكنك الاطلاع على مثال لتحويل DTO وتسجيل البيانات المزيفة وإرجاعها في نموذج التطبيق هذا.

يمكنك عرض الكود المصدري على CodeSandbox.
في هذا المثال، لدينا React Hook الذي يقوم بتحميل صورة كعنوان URL لكائن Blob. يقوم بتخزين عنوان URL مؤقتًا لتعيين عنوان URL لـ Blob في مساحة تخزين الجلسة. بمجرد التحميل، سيؤدي أي تحديث للصفحة إلى تحميل الصورة من URL Blob على الفور.
const useBlobUrl = ( imageUrl ) => {
const [ objectURL , setObjectURL ] = useState ( '' ) ;
useEffect ( ( ) => {
let url = sessionStorage . getItem ( imageUrl ) ;
async function fetchData ( ) {
if ( ! url ) {
const { data } = await thwack . get ( imageUrl , {
responseType : 'blob' ,
} ) ;
url = URL . createObjectURL ( data ) ;
sessionStorage . setItem ( imageUrl , url ) ;
}
setObjectURL ( url ) ;
}
fetchData ( ) ;
} , [ imageUrl ] ) ;
return objectURL ;
} ;شاهد هذا المثال على CodeSandbox
لديك الآن نقطة نهاية REST على https://api.example.com . لنفترض أنك قمت بنشر نقطة نهاية REST جديدة إلى عنوان URL مختلف وترغب في البدء ببطء في توجيه 2% من حركة مرور الشبكة إلى هذه الخوادم الجديدة.
ملاحظة: عادةً ما يتم التعامل مع هذا الأمر بواسطة موازن التحميل الخاص بك على الواجهة الخلفية. يتم عرضه هنا لأغراض العرض التوضيحي فقط.
يمكننا تحقيق ذلك عن طريق استبدال options.url في مستمع حدث الطلب على النحو التالي.
thwack . addEventListener ( 'request' , ( event ) => {
if ( Math . random ( ) >= 0.02 ) {
return ;
}
// the code will be executed for approximately 2% of the requests
const { options } = event ;
const oldUrl = thwack . getUri ( options ) ;
const url = new URL ( '' , oldUrl ) ;
url . origin = 'https://api2.example.com' ; // point the origin at the new servers
const newUrl = url . href ; // Get the fully qualified URL
event . options = { ... event . options , url : newUrl } ; // replace `options`]
} ) ; جنبًا إلى جنب مع use-thwack ، فإن كتابة تطبيق جلب البيانات لـ React Native لا يمكن أن يكون أسهل.
عرض التطبيق بأكمله الذي يعمل على Expo.

Thwack مستوحى بشكل كبير من Axios. شكرا مات!
مرخص تحت معهد ماساتشوستس للتكنولوجيا
شكرًا لهؤلاء الأشخاص الرائعين (مفتاح الرموز التعبيرية):
دونافون ويست ؟ | جيريمي تايس | يوريما استيفيز | جيريمي بارجار | بروك سكارليت يالوف | كارل هوركي | كوجي |
توم بيرر | إيان ساذرلاند | بليك يودر | ريان هينشي | ميرو دويكيتش | com.santicevic |
يتبع هذا المشروع مواصفات جميع المساهمين. المساهمات من أي نوع موضع ترحيب!