Объект Deferred.
Каждый, кто когда-либо использовал AJAX, знаком с асинхронным программированием. Это когда мы запускаем некий процесс (скажем, XMLHTTPRequest ) и задаем функцию callback обработки результата.
На первый взгляд, все очень просто, но лишь до тех пор, пока мы не захотим добавить вызов новой функции после callback , сделать удобную обработку ошибок и исключений, а также - предусмотреть добавление новых функций в конец цепочки асинхронных вызовов.
Один способ - добавлять каллбэки в параметры всех функций. Другой - использовать для управления асинхронностью отдельный объект. Назовем его Deferred .
Такой объект есть, например, в библиотеке Mochikit и во фреймворке dojo.
Начнем - издалека, с простого примера, который прояснит суть происходящего. Если кому-то простые примеры не нужны - следующий раздел: Асинхронное программирование не для чайников. <code>Deferred</code>..
Нужно отправить результат голосования на сервер и показать ответное сообщение.
Посылкой данных на сервер занимается функция sendData . Эта функция - общего вида, вызывается в куче мест.
В зависимости от результата вызывается callback , если все ок, либо errback - в случае ошибки при запросе.
function sendData(url, data, callback, errback) {
var xhr = new XmlHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState==4) {
if (xhr.status==200) {
callback(xhr.responseText)
} else {
errback(xhr.statusText)
}
}
}
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send("data="+encodeURIComponent(data))
}
Функция processVoteResult обрабатывает JSON-результат ответа сервера.
function processResult(data) {
var data = eval( '('+data+')' )
showMessage(data.text)
}
Обработку ошибок пусть делает функция handleError , для простоты:
function handleError(error) { alert(error) }
Используя функцию отправки sendData , обработки результата processResult , теперь можно записать, наконец, метод голосования:
function vote(id) {
sendData("http://site.ru/vote.php", id, processResult, handleError)
}
В простейшем случае, все - работа закончена. Но полученная реализация обладает рядом недостатков.
- Не учитывается возможность ошибки в processResult, например, при вызове eval.
- При использовании этого кода нельзя добавить в цепочку вызовов новую функцию
updateVoteInfo() , чтобы, она, скажем, сработала после showMessage .
Один способ решения проблемы 2 - это добавить к processResult аргумент callback и вставить вызов updateVoteInfo через промежуточный обработчик результата в функции vote :
function sendData(url, data, callback) {
var xhr = new XmlHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState==4) { callback(xhr.responseText) }
}
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send("data="+encodeURIComponent(data))
}
function processResult(data, callback) {
var data = eval( '('+data+')' )
showMessage(data.text)
callback(data)
}
function vote(id) {
var process = function(result) {
processResult(result, updateVoteInfo)
}
sendData("http://site.ru/vote.php", id, process, handleError)
}
Надеюсь, в коде все понятно, т.к пока что он довольно простой... Но как сделать так, чтобы исключение внутри любого асинхронного обработчика (например, processResult ) не приводило к ошибке javascript и падению всей цепочки?
Чтобы обработка ошибок и исключения была схожей - добавим к обработчику аргумент errback и будем вызывать его при исключении. А заодно сделаем то же самое и с функцией vote .
function sendData(url, data, callback, errback) {
var xhr = new XmlHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState==4) {
if (xhr.status==200) {
callback(xhr.responseText)
} else {
errback(xhr.statusText)
}
}
}
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send("data="+encodeURIComponent(data))
}
function processResult(data, callback, errback) {
try {
var data = eval( '('+data+')' )
showMessage(data.text)
callback(data)
} catch(e) {
errback(e.message)
}
}
function vote(id, callback, errback) {
var process = function(result) {
processResult(result, callback, errback)
updateVoteInfo(result)
}
sendData("http://site.ru/vote.php", id, process, errback)
}
Код получился чуть переусложненный. Сравним с тем же, но синхронным кодом:
function vote(id) {
try {
var result = sendData("http://site.ru/vote.php", id)
processResult(result)
updateVoteInfo(result)
} catch(e) {
handleError(e)
}
}
function processResult(data) {
var data = eval( '('+data+')' )
showMessage(data.text)
}
function sendData(url, data, callback) {
var xhr = new XmlHttpRequest()
xhr.open("POST", url, false);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send("data="+encodeURIComponent(data))
if (xhr.status==200) {
return xhr.responseText
} else {
throw xhr.statusText
}
}
- В асинхронном коде аргументы
callback/errback
- их нет при обычном, последовательном программировании
- В асинхронном коде обратная последовательность действий
- сначала делается обработчик результата, а потом - вызывается метод
- Асинхронный код длиннее
Аналогичный пример с объектом Deferred выглядел бы так
function vote(id) {
var deferred = sendData("http://site.ru/vote.php", id)
deferred.addCallback(processResult)
deferred.addCallback(updateVoteInfo)
deferred.addErrback(handleError)
}
function sendData(url, data) {
var xhr = new XmlHttpRequest()
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
var deferred = new Deferred()
xhr.onreadystatechange = function() {
if (xhr.readyState==4) {
if (xhr.status==200) {
deferred.callback(xhr.responseText)
} else {
deferred.errback(xhr.statusText)
}
}
}
xhr.send("data="+encodeURIComponent(data))
return deferred
}
function processResult(data) {
var data = eval( '('+data+')' )
showMessage(data.text)
return data
}
Смысл объекта Deferred - состоит в исключении всей асинхронности из кода. Асинхронностью занимается объект Deferred .
А сам код становится проще, понятнее и позволяет легко организовывать цепочки асинхронных вызовов.
Следующая статья описывает сам объект Deferred в деталях.
|
Имеет смысл написать, что в реализации JavaScript нет встроенного конструктора Deferred, и для использования этого стека обработчиков нужно подключить фреймворк. Иначе это с ходу вводит в заблуждение.
А можно увидеть внутреннюю реализацию Deferred? Уверен, что она не такая сложная, чтобы создавать отдельный класс для решения такой задачи.
Вы сами себе противоречите: навешиваете обработчик на onreadystatechange ПОСЛЕ действия (open, send).
интересный подход, но я немного не понял следующее:
сперва делается sendData, а только потом addCallback/addErrback, понятно дело что при честном http-запросе, код выполнится раньше чем придет результат, но если говорить вообще об асинхронном программировании, результат может прийти раньше чем добавятся обработчики. Или может я что-то не так понял?
Ну, теоретически результат может прилететь раньше, но на практике вряд-ли. К тому же, идеологически, в навешивании callback-а не должно быть никакой сложной логики, и тот код должен выполнятся сравнительно моментально.
Дополнение - в самом Deffered должно быть предусмотрено, что если методом addCallback(callback) обработчик добавляется после того, как событие произошло, то callback вызывается сразу-же.
Не просто "должно быть предусмотрено" -- оно там в самом деле предусмотрено.
если ответ придёт раньше, чем будет навешен обработчик - то обработчик запустится немедленно.
Таким образом deferred избавляет нас от кошмарной вложенности callback'ов, код выглядит "последовательным" и более читабельным
Такие допущения приводят к "плавающим" ошибкам, которые отловить практически нельзя.
Что касается "в теории": если файл закеширован, а при навешивании все-таки происходят некоторые действия, ответ можно получить раньше чем ожидается.
Что касается "на практике": при отладке поставь точку останова на
и все обработчики пойдут лесом. По моему весьма жизненно.
Но подход интересный. В больших проектах асинхронные баги добавляют немало головной боли.
нет не должен, вы не учитивает работу событийного цикла.
Почему бы не написать проще, без всяких deferred:
Если у Deferred вызвать errback с "не ошибкой", например .errback(10) - по описанию получается что Deferred будет в состоянии "success" и вызовы начнутся с callback- в не errback-функций. run 3 free online
Thank you very much for giving this awesome post, it is a great way to fully enjoy it.
cool math run 3
Your article makes me more experienced and impressed, I hope you will have more good posts in the near future to share with readers. atari breakout
We are the children
We are the ones who make a brighter day, so let's start giving
There's a choice we're making
We're saving our own lives
It's true we'll make a better day, just you and me
emoji
This article became properly written! It's first-rate to recognize How to Read Tarot Cards.
It is a good and amazing article. Your facts could be very useful for me and for others. obc net banking
Your article is very useful, the content is great, I have read a lot of articles, but for your article, it left me a deep impression, thank you for sharing. candy crush soda
I love watching comedy video if you also like then click here comedy whatsapp status video download free this the best website for download free short video
Very nice article check out my new website article
Very nice article check out my new website article mahashivrratri status
Thanks for the useful information! You helped me with advice!
This information you provide is really great, I want to thank you very much, for sharing this information with us. basketballlegends
Do not say but do. Don't chatter but act. Don't promise but prove it. Let's share the good things krunker
Wow the blog you give us is amazing, no wonder many people want to read this. https://celebrityinsider.org/
I will recomend this blog to all of my friends. Great article.
https://happygamer.com/
Thank you for this inspiring blog. I wait for more
https://ballstepded.com/
I learned so much from this blog. Good inforamtion. https://fixoserror.com/
I wait for more.Great article.
https://premiereretail.com
I stumbled across this blog.Great article. https://tecsprint.com
Thank you for this amazing blog. Congratulations.
https://howtolose10poundsinaweek.comArne Christensen
The things i see here are very informative. Keep going. https://bargainistafashionista.com
I can say that is one of the best articles out on the internet. https://bankncard.com
I readed all the article. So informative https://vhan.net
This is one of the best sites i have found on the internet until now. Nice article keep going.
https://millikenconstructioninc.com/
Thanks for the information, very clear and simple. I will try to use it.Love the way you write. Working my way through your article links
https://vvhen.to/
This is one of the best articles i found on the blogs around the internet. I am really interested in seeing more of this. Keep going with the great work!
https://gzgjskpzz1m.ga
First of all ,you have picked a very unique theme . I think i might design something similar for a future project that i want to build .
On top of that ,i in truth enjoy most of your content pieces and your different point of view.
Thank you https://seoconsultants24.blogspot.com/
Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.https://seokarma24.blogspot.com/
I have reviewed the article many times and I find it very impressive. The information is extremely useful especially the last part I care about that information very much. I have been looking for this certain information for a long time.
https://packseo.blogspot.com/
I’m gone to tell my little brother, that he should
also pay a quick visit this blog on regular basis to take updated from hottest information.
https://connectorseo.blogspot.com/
You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://digitalseo24h.blogspot.com/
Fantastic blog! Do you have any helpful hints for aspiring writers?
I’m hoping to start my own site soon but I’m a little lost on everything.
https://sweetseo24h.blogspot.com/
I am hoping the same best effort from you in the future as well. In fact your creative writing skills has inspired me.
https://fancyseo24h.blogspot.com/
You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://phoenixseogeek.com/
Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.
https://zgjskpzz1m.ga/
I think that thanks for the valuabe information and insights you have so provided here. Check Mapquest Driving directions to finish your trip!
Thanks so much for this information.
I have to let you know I concur on several of the points you make here and others may require some further review,
but I can see your viewpoint. 먹튀검증
This is a great article thanks for sharing this informative information. I will visit your blog regularly for some latest post. 대출
You know your projects stand out of the herd. There is something special about them. It seems to me all of them are really brilliant!
https://larkenequity.com/
https://larkenequity.com/
Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://spacnetwork.com/
https://spacnetwork.com/
I have bookmarked your blog, the articles are way better than other similar blogs.. thanks for a great blog!
https://cultivo-protegido.com/
https://cultivo-protegido.com/
this is really nice to read..informative post is very good to read..thanks a lot!
https://entutorar.com/
https://entutorar.com/
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://malla-pepinera.com/
https://malla-pepinera.com/
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
https://entutorar-tomates.com/
https://entutorar-tomates.com/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://manta-termica.com/
https://manta-termica.com/
The post is written in very a good manner and it contains many useful information for me.
https://rafia-agricola.com/
https://rafia-agricola.com/
this is really nice to read..informative post is very good to read..thanks a lot!
https://malla-tutora.com/
https://malla-tutora.com/
Very inspiring and helpful
https://malla-tutora.mx/
https://malla-tutora.mx/
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://malla-sombra.com/ https://malla-sombra.com/
You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://malla-sombra.mx/
https://malla-sombra.mx/
Oh, great, your article provided me with useful information and a fresh perspective on the subject.
https://malla-espaldera.com/
https://malla-espaldera.com/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://malla-espaldera.mx/
https://malla-espaldera.mx/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://gallinero.mx/
https://gallinero.mx/
Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.https://control-de-palomas.mx/
https://control-de-palomas.mx/
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://casa-sombra.com/
https://casa-sombra.com/
This solved the problem I was having for my personal project ! Thank you !
https://casa-sombra.mx/
https://casa-sombra.mx/
I wish more authors of this type of content would take the time you did to research and write so well. I am very impressed with your vision and insight.
https://chickenmalla.com/
https://chickenmalla.com/
You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog.
https://ground-cover.mx/
https://ground-cover.mx/
Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject.
https://chickenmalla.net/
https://chickenmalla.net/
You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://chickenmallas.com/
https://chickenmallas.com/
You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://chickenmallas.net/
https://chickenmallas.net/
Your information was very useful to me. That's exactly what I've been looking for
https://guacamalla.com/
https://guacamalla.com/
Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://guacamalla.net/
https://guacamalla.net/
It is wonderful to be here with everyone, I have a lot of knowledge from what you share, to say thank you, the information and knowledge here helps me a lot
https://guacamallas.com/
https://guacamallas.com/
Wow very good post, please dont stop posting things like this because ie really enjoy this
https://guacamallas.net/
https://guacamallas.net/
I high appreciate this post.
https://hortoclips.com/
https://hortoclips.com/
It’s hard to find the good from the bad sometimes, but I think you’ve nailed it!
https://hortoclips.net/
https://hortoclips.net/
You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://hortocost.com/
https://hortocost.com/
Seriously interesting points produced here. I are going to be again quickly to view what else there’s to read up on.
https://hortocost.info/
https://hortocost.info/
You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://hortocost.net/
https://hortocost.net/
I found that site very usefull and this survey is very cirious, I ' ve never seen a blog that demand a survey for this actions, very curious...
https://hortomalha.com/
https://hortomalha.com/
I high appreciate this post. It’s hard to find the good from the bad sometimes, but I think you’ve nailed it! would you mind updating your blog with more information?
https://hortomalla.com/
https://hortomalla.com/
This is a great inspiring article.I am pretty much pleased with your good work.
https://hortomallas.cn/
https://hortomallas.cn/
You put really very helpful information. Keep it up. Keep blogging. Looking to reading your next post.
https://hortomallas.es/
https://hortomallas.es/
I have a hard time describing my thoughts on content, but I really felt I should here.
https://hortomallas.hk/
hhttps://hortomallas.hk/
Wow very good post, please dont stop posting things like this because ie really enjoy this
https://invernavelo.com/
https://invernavelo.com/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://invernavelo.net/
https://invernavelo.net/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://mallajuana.net/
https://mallajuana.net/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://obamalla.com/
https://obamalla.com/
this is really nice to read..informative post is very good to read..thanks a lot!
https://obamalla.net/
https://obamalla.net/
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://ortomallas.com/
https://ortomallas.com/
This solved the problem I was having for my personal project ! Thank you !
https://scrog.mx/
https://scrog.mx/
I wish more authors of this type of content would take the time you did to research and write so well. I am very impressed with your vision and insight.
https://cultivos-hidroponicos.com/
https://cultivos-hidroponicos.com/
You completed a few fine points there. I did a search on the subject and found nearly all persons will go along with with your blog.
https://bird-control-net.com/
https://bird-control-net.com/
Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject.
https://anti-bird-netting.com/
https://anti-bird-netting.com/
You are a very persuasive writer. I can see this in your article. You have a way of writing compelling information that sparks much interest.
https://anti-deer-fence.net/
https://anti-deer-fence.net/
It is wonderful to be here with everyone, I have a lot of knowledge from what you share, to say thank you, the information and https://bird-netting.net/
https://bird-netting.net/
Oh, great, your article provided me with useful information and a fresh perspective on the subject.
https://cannabis-netting.net/
https://cannabis-netting.net/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://chicken-wire.net/
https://chicken-wire.net/
Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.https://crop-netting.net/
https://crop-netting.net/
Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
https://cucumber-net.com/
https://cucumber-net.com/
Very inspiring and helpful
https://cucumber-trellis.net/
https://cucumber-trellis.net/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://horticulture-netting.com/
https://horticulture-netting.com/
The post is written in very a good manner and it contains many useful information for me.
https://marijuana-netting.net/
https://marijuana-netting.net/
I have bookmarked your blog, the articles are way better than other similar blogs.. thanks for a great blog!
https://plastic-netting.net/
https://plastic-netting.net/
Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read.
https://poultry-netting.net/
https://poultry-netting.net/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://shade-cloth.net/
https://shade-cloth.net/
Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
https://shade-net.net/
https://shade-net.net/
Your information was very useful to me. That's exactly what I've been looking for
https://tomato-clips.com/
https://tomato-clips.com/
Thanks For sharing this Superb article.I use this Article to show my assignment in college.it is useful For me Great Work.
https://trellising-net.com/
https://trellising-net.com/
I found that site very usefull and this survey is very cirious, I ' ve never seen a blog that demand a survey for this actions, very curious...
https://trellis-netting.net/
https://trellis-netting.net/
Very interesting discussion glad that I came across such informative post. Keep up the good work friend
https://pestcontrolcanberraarea.com.au
https://pestcontrolcanberraarea.com.au
Your article is really great. I like the way you wrote this information.
https://emergencylocksmithperth.com.au/
https://emergencylocksmithperth.com.au/
I found that site very usefull and this survey is very cirious, I ' ve never seen a blog that demand a survey for this actions, very curious...
https://bestpestcontrolperth.com.au/
https://bestpestcontrolperth.com.au/
This solved the problem I was having for my personal project ! Thank you !
https://onlinecrowd.com.au
https://onlinecrowd.com.au
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https:https://emergencydental247.com/ https://emergencydental247.com/o/
You are a very persuasive writer. You have a way of writing compelling information that sparks much interest.
audigitalsolutions.com
audigitalsolutions.com">audigitalsolutions.com
This is very educational content and written well for a change. It's nice to see that some people still understand how to write a quality post.!
https://woontuinmagazine.nl/
https://woontuinmagazine.nl/
It is wonderful to be here with everyone, I have a lot of knowledge from what you share, to say thank you, the information and https://audigitalsolutions.com/
https://audigitalsolutions.com/
Now with coronavirus is really interesting to read things liek this on the internet when you stay at home
https://plasticpalletsales.com
https://plasticpalletsales.com
I have bookmarked your blog, the articles are way better than other similar blogs.. thanks for a great blog!
https://megabonuscasino.nl/
https://megabonuscasino.nl/
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed
https://vosairservices.com/
https://vosairservices.com/
Excellent article. Very interesting to read. I really love to read such a nice article. Thanks! keep rocking.
https://entutorado.com/
https://entutorado.com/
Do you have a spam issue on this site; I also am a blogger, and I was curious about your situation; many of us have developed some nice practices and we are looking to trade techniques with other folks, be sure to shoot me an email if interested.
https://atlanticflagpole.com
https://atlanticflagpole.com
Check out my new blog https://latest-shayari.com/family-shayari-in-hindi/
No matter if some one searches for his necessary thing, thus he/she wishes to be available that in detail, thus that thing is maintained over here.
https://schmidtchristmasmarket.com/
https://schmidtchristmasmarket.com/
It's wonderful to be here with everyone, Nice post. Thanks for sharing! I have a lot of knowledge from what you are sharing, to say thank you, the information and knowledge here helps me a lot. Quel robot patissier choisir
Great content on this royal attitude status
Attractive component of content. I just stumbled upon your weblog and in accession capital to say that I acquire actually enjoyed account your weblog posts. Any way I will be subscribing in your feeds or even I achievement you get admission to consistently fast.
https://whispersandhoney.com/
https://whispersandhoney.com/
скачать yowhatsapp для бесплатных текстовых сообщений, звонков
There are many options available to you in your spare time, but will you choose pure entertainment or both entertaining and training yourself? Fun, comfortable, free, and ich are what Sudoku 247 gives you.
Это когда мы запускаем некий процесс (скажем, XMLHTTPRequest) и задаем функцию callback обработки результата. 188bet
Yes i am completely concurred with this article and i simply need say this article is extremely decent and exceptionally useful article.I will make a point to be perusing your blog more. You made a decent point yet I can"t resist the urge to ponder, shouldn"t something be said about the other side? 토토사이트추천
Roksa piekary slaskie
There are many options available to you in your spare time, but will you choose pure entertainmen and good java info for you 토토사이트
Yes i am completely concurred with this article and i simply need say this article is extremely decent and exceptionally good java info me check web 카지노사이트
it's nice to meet you! I stumbled upon your WhatsApp while browsing for latest version and was wondering if you had any questions about WhatsApp. It's interesting to see that we both have the same passion for WhatsApp and I'm really glad we were able to connect because of it! We should definitely keep in touch and maybe even hang out sometime using latest ! Hey, so I saw your post about WhatsApp mods and noticed that you are in the same boat as me when it comes to WhatsApp . We've been friends on Facebook for ages and it's so cool to see that we like to use the same. WhatsApp has been a part of many lives since its very new in 2023 . Whatsapp has now become one of the most popular messaging apps around the globe and has more than 1 billion monthly users. latest version not only use it to stay connected with their friends and family members but also use it to stay connected with their business contacts. WhatsApp app is an instant messaging app that offers text, voice calls, video calls, and the ability to send APK files in size. Whatsapp mods are the best way to customize your FMWA and make it look like you want it to. Today, there are thousands of GB mods available for Whatsapp account. Each one has a different set of Whatsapp accounts that can help you change the appearance or functionality of your app. For example, there are mods that change the color of your chat bubbles or allow you to send stickers without having to download them first. There are also gb mods that let you record video messages without having to switch apps or use any other third-party software.With growing popularity of WhatsApp , there have been many WhatsApp mods downloaded which can be used on any smartphone running on Android device or iOS operating systems. download YoWhatsApp & FMWhatsApp APK on Mrbass
Clash of Clans adalah game strategi yang dapat dimainkan di ponsel Android maupun Iphone. Game yang satu ini dikembangkan dan diterbitkan oleh pengembang permainan asal Finlandia, yaitu Supercell. Permainan ini dirilis untuk platform iOS pada 2 Agustus 2012, dan di Google Play untuk Android pada 7 Oktober 2013. temukan base th 14, base th 13 dan base th 12 dan copy base melakui link agar dapat kamu gunakan secara gratis.
Thanks for the good article. I hope to see you with a better article than the one I am writing now. Thank you again 먹튀검증
Now your article is a very impressive article for me. I look forward to seeing your majestic writings in the future. Take good care of me 메이저사이트
Hello! I love your post!
black screen helps your eyes less strain and white screen tool
Thank you for taking the time to publish this information very useful! 토토
Really impressed! Everything is very open and very clear clarification of issues. 스포츠중계
This is my first time i visit here and I found so many interesting stuff in your blog especially it's discussion, 스포츠토토
I’m going to read this. I’ll be sure to come back. 슬롯
SexyPG89 689สล็อต เกมสล็อต แทงบอลออนไลน์ แตกง่าย แตกหนัก แจกจริง เว็บตรงมาแรง แห่งปี 2023
Hello, I read the post well. 온라인바카라 It's a really interesting topic and it has helped me a lot. In fact, I also run a website with similar content to your posting. Please visit once
gfjj
Hello, I'm happy to see some great articles on your site. Would you like to come to my site later? My site also has posts, comments and communities similar to yours. Please visit and take a look 카지노사이트
The weather has gotten a lot colder. I hope you dress warmly and drink lots of warm water so that you don't catch a cold because it's suddenly gets cold. This cold is very strong.메이저놀이터
The best article I ran over various years, compose something about it on this page. Commercial Mortgage Broker Penrith
The temperature has significantly dropped. I hope you wear warm clothing and drink lots of warm water to avoid getting a cold when the weather suddenly turns chilly. The chill is extremely intense. tunnel rush
Wow, fantastic blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your website is fantastic, as well as the content!biobet789" title="biobet789">biobet789
Wow, fantastic blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your website is fantastic, as well as the content!biobet789" title="biobet789">biobet789
ufa789bet แหล่งเดิมพันออนไลน์ที่ดีที่สุด
เว็บสล็อตเว็บตรง แหล่งเดิมพันออนไลน์ที่ดีที่สุด
THE ONE CARGO. ตัวแทน นำเข้าสินค้าจากจีน สั่งซื้อและนำเข้าสินค้าจากประเทศจีนแบบครบวงจร ให้บริการ ออก FORM E เป็นการลดภาษีนำเข้าสินค้าหรือนำเข้าเป็น 0% บริการตรวจสอบเบื้องต้นเกี่ยวกับโรงงานว่ามีการจดทะเบียนถูกต้อง