{"id":229804,"date":"2022-11-24T10:04:00","date_gmt":"2022-11-24T07:04:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229804"},"modified":"2022-11-09T16:26:40","modified_gmt":"2022-11-09T13:26:40","slug":"att-arbeta-korrekt-med-ajax-foerfraagningar-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/att-arbeta-korrekt-med-ajax-foerfraagningar-i-wordpress\/","title":{"rendered":"Att arbeta korrekt med Ajax-f\u00f6rfr\u00e5gningar i WordPress"},"content":{"rendered":"\n<p>N\u00e4rhelst du arbetar med tredjeparts-API:er, och du g\u00f6r det i en asynkron natur, finns det alltid en chans att vad det \u00e4n \u00e4r du efterfr\u00e5gar kommer att returnera ett o\u00f6nskat resultat.<\/p>\n<p>Kanske \u00e4r det en felkod, kanske \u00e4r det en varning, eller s\u00e5 \u00e4r det ett enkelt meddelande som s\u00e4ger n\u00e5got i stil med &quot;Vi behandlar fortfarande din beg\u00e4ran fr\u00e5n v\u00e5r sida.&quot;<\/p>\n<p>I varje fall kan du vanligtvis hantera dem p\u00e5 serversidan bra och l\u00e5ta klientsidan veta hur det ska hanteras. Men om du har att g\u00f6ra med det senare fallet, \u00e4r det d\u00e4r du blockeras av tredje parts bearbetning; det finns andra saker du kan g\u00f6ra f\u00f6r att hantera den h\u00e4r situationen b\u00e4ttre.<\/p>\n<p>Till exempel, i det senare fallet \u00e4r det b\u00e4ttre att v\u00e4nta en liten stund och sedan g\u00f6ra beg\u00e4ran igen f\u00f6r att se om API:et har ett annat svar f\u00f6r dig.<\/p>\n<p>Men n\u00e4r man g\u00f6r detta kr\u00e4ver det Ajax som uppenbarligen kr\u00e4ver JavaScript. En av de uppenbara, \u00e4nnu mer daterade metoderna f\u00f6r att g\u00f6ra detta \u00e4r att anv\u00e4nda setInterval.<\/p>\n<p>Problemet med detta \u00e4r dock att det skapar en stapel av f\u00f6rfr\u00e5gningar och sedan, n\u00e4r svaret \u00e4r klart, kommer varje objekt i stacken att f\u00e5 samma svar.<\/p>\n<p>Detta kan drastiskt p\u00e5verka vilken server som helst. Och det finns b\u00e4ttre s\u00e4tt att g\u00f6ra detta p\u00e5.<\/p>\n<h2>Arbetar korrekt med Ajax-f\u00f6rfr\u00e5gningar<\/h2>\n<p>Som vanligt, eftersom WordPress levereras med jQuery, kommer jag att anv\u00e4nda det; Men jag uppmanar dig ocks\u00e5 \u2013 om du inte redan har gjort det \u2013 att titta p\u00e5 <strong><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Guide\/AJAX\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajax i ES6<\/a><\/strong> f\u00f6r att f\u00e5 en uppfattning om hur man g\u00f6r det h\u00e4r.<\/p>\n<p>Hur som helst, tanken \u00e4r denna: Ist\u00e4llet f\u00f6r att st\u00e4lla in n\u00e5got intervall, anv\u00e4nd sedan de inbyggda Ajax-funktionerna f\u00f6r att utv\u00e4rdera svaret ordentligt. Och bara under vissa f\u00f6rh\u00e5llanden, aktivera funktionen igen.<\/p>\n<p>Exempel: <a href=\"https:\/\/api.jquery.com\/jquery.post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jQuerys $.post-<\/a> metod erbjuder n\u00e5gra funktioner som kan anv\u00e4ndas f\u00f6r just detta. Till exempel erbjuder den metoder som:<\/p>\n<ul>\n<li>Gjort()<\/li>\n<li>misslyckas()<\/li>\n<li>alltid()<\/li>\n<\/ul>\n<p>Och var och en av dessa \u00e4r avsedd att k\u00f6ras under vissa f\u00f6rh\u00e5llanden som jag kommer att visa i n\u00e5gra kodexempel tillf\u00e4lligt.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164533-61e766ff924f1.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164533-61e766ff924f1.png\" alt=\"Att arbeta korrekt med Ajax-f\u00f6rfr\u00e5gningar i WordPress\" ><\/a><\/p>\n<p>Innan du g\u00f6r det \u00e4r det dock viktigt att f\u00f6rst\u00e5 att det finns flera parametrar som jag skickar som jag antar att du \u00e4r bekant med:<\/p>\n<ul>\n<li>WordPress Ajax URL (som jag kommer att definiera som acme.ajax_url),<\/li>\n<li>en URL till inl\u00e4gget vi tittar p\u00e5 (som kommer att lagras i en sUrl-variabel),<\/li>\n<li>och ett s\u00e4kerhetsmeddelande som jag kommer att kalla acme.security<\/li>\n<\/ul>\n<p>Om n\u00e5got av ovanst\u00e5ende inte \u00e4r klart, l\u00e4s de l\u00e4nkade sidorna f\u00f6r att se hur detta uppn\u00e5s.<\/p>\n<p>Men med det sagt, h\u00e4r \u00e4r id\u00e9n bakom hur du kan hantera upprepade Ajax-svar utan setInterval.<\/p>\n<h3>1 En funktion f\u00f6r arbetet<\/h3>\n<p>Det f\u00f6rsta du beh\u00f6ver g\u00f6ra \u00e4r att linda in arbetet du ska g\u00f6ra i sin egen funktion. Detta inneb\u00e4r att du kan anropa det fr\u00e5n n\u00e5gon annanstans i klientsidans applikation eller till och med inom ramen f\u00f6r en timer (om det absolut beh\u00f6vs).<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-00-initial-function-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Till exempel<\/a><\/strong> :<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n      \/\/ ...\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n      \/\/ ...\n    })\n    .always(function() {\n      \/\/ ..\n    });\n}\n<\/code><\/pre>\n<p>Och, som du kan se, har jag g\u00e5tt vidare och stoppat ut n\u00e5gra av funktionerna jag n\u00e4mnde ovan.<\/p>\n<h3>2 Hantera framg\u00e5ngen<\/h3>\n<p>I fallet med framg\u00e5ngen kan du anv\u00e4nda <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-01-handle-success-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en anonym funktion<\/a><\/strong> som callback f\u00f6r <strong>$.post-<\/strong> funktionen. Det prim\u00e4ra argumentet som du b\u00f6r bry dig om \u00e4r <strong>svarsargumentet<\/strong>.<\/p>\n<p>Vanligtvis gillar jag att mitt svar har ett <strong>framg\u00e5ngsattribut<\/strong> och ett <strong>misslyckandeattribut<\/strong>. Detta g\u00f6r det l\u00e4ttare att hantera ett \u00e4rende n\u00e4r svaret \u00e4r helt framg\u00e5ngsrikt men data som kom tillbaka fr\u00e5n servern var inte vad jag f\u00f6rv\u00e4ntade mig.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM.\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n      \/\/ ...\n    })\n    .always(function() {\n      \/\/ ...\n    });\n}\n<\/code><\/pre>\n<p>Detta betyder inte n\u00f6dv\u00e4ndigtvis att det har skett ett misslyckande. Det betyder bara att allt jag letade efter inte hittades.<\/p>\n<h3>3 Hantera felet<\/h3>\n<p>\u00c5 andra sidan finns det tillf\u00e4llen d\u00e5 n\u00e5got kan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-02-handle-failure-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">misslyckas<\/a><\/strong>. Varf\u00f6r detta h\u00e4nder kan bero p\u00e5 ett antal olika anledningar och f\u00f6r att f\u00f6rst\u00e5 det ordentligt \u00e4r det v\u00e4rt att inspektera argumenten som \u00e5teruppringningen ger, n\u00e4mligen <strong>statusen<\/strong> och <strong>felet<\/strong>.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM like flashing the first image.\n      $('img:first').fadeTo('fast', 0.5, function() {\n        $(this).fadeTo('fast', 1);\n      });\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      cosole.log(error);\n    })\n    .always(function() {\n      \/\/ ...\n    });\n}\n<\/code><\/pre>\n<p>Jag kan inte ge konkreta exempel h\u00e4r eftersom varje API \u00e4r olika; dock rekommenderar jag \u00e5tminstone att skriva ut data till konsolen s\u00e5 att du kan f\u00f6rst\u00e5 vad som h\u00e4nder och hur du graci\u00f6st kan hantera det p\u00e5 kodniv\u00e5.<\/p>\n<h3>4 Hantera det ovillkorliga fallet<\/h3>\n<p>I det h\u00e4r specifika fallet kommer den h\u00e4r funktionen att aktiveras <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-03-handle-always-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oavsett<\/a><\/strong> om n\u00e5got lyckades eller inte.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM like flashing the first image.\n      $('img:first').fadeTo('fast', 0.5, function() {\n        $(this).fadeTo('fast', 1);\n      });\n    })\n    .done(function(response) {\n      \/\/ ...\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      console.log(error);\n    })\n    .always(function() {\n      \/\/ Regardless of what happens, this is where you can provide the user feedback.\n    });\n}\n<\/code><\/pre>\n<p>Den h\u00e4r funktionen \u00e4r inte n\u00e5got du alltid beh\u00f6ver (ingen ordlek), men det \u00e4r ett bra alternativ f\u00f6r att till exempel d\u00f6lja en f\u00f6rloppsindikator eller visa n\u00e5got i anv\u00e4ndargr\u00e4nssnittet. Detta kan ge anv\u00e4ndaren lite feedback om att beg\u00e4ran har slutf\u00f6rt sitt arbete (igen, oavsett misslyckande eller framg\u00e5ng).<\/p>\n<h3>5 Hantera framg\u00e5ngen, igen<\/h3>\n<p>Slutligen, den <strong>f\u00e4rdiga<\/strong> metoden \u00e4r mycket lik framg\u00e5ngsmetoden, men t\u00e4nk p\u00e5 att den \u00e4r avsedd att kallas en andra g\u00e5ng.<\/p>\n<p>Det betyder att efter att svaret har kommit tillbaka fr\u00e5n servern med <strong>svarsargumentet<\/strong>, kommer samma sak att aktiveras igen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2dbe93fe47a96657e2ce7e4da0313bab#file-04-handle-success-again-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e4r allt annat har slutf\u00f6rts<\/a>.<\/p>\n<pre><code>var _processArticle = function() {\n\n  var request =\n    $.post(acme.ajax_url, {\n      action:  'acme_get_data',\n      url:      sUrl\n      security: acme.security\n    }, function(response) {\n\n      \/\/ Abort all request operations.\n      if (false === response.success) {\n        request.abort();\n      }\n\n      \/\/ Handle the successful response by modifying the DOM.\n    })\n    .done(function(response) {\n      \/\/ Display any additional changes you may want to make based on the respnse.\n    })\n    .fail(function(xhr, status, error) {\n\n      console.log('There was a problem with contacting the API.');\n\n      console.log('The status was:');\n      console.log(status);\n\n      console.log('The error was:')\n      console.log(error);\n    })\n    .always(function() {\n      \/\/ Regardless of what happens, this is where you can provide the user feedback.\n    });\n}\n<\/code><\/pre>\n<p>Detta ger dig ytterligare en chans att g\u00f6ra vad du vill med svarsargumentet en g\u00e5ng till innan allt \u00e4r klart.<\/p>\n<p>Jag anv\u00e4nder det s\u00e4llan, men det har funnits tillf\u00e4llen d\u00e4r jag har velat ta bort ett element f\u00f6rst efter att n\u00e5got gjorts, all annan bearbetning var klar och svaret lyckades.<\/p>\n<h2>Kanske beh\u00f6ver du inte allt<\/h2>\n<p>Uppenbarligen \u00e4r mycket av koden ovan bara f\u00f6r en demo om hur man hanterar f\u00f6rfr\u00e5gningar. Men syftet \u00e4r att visa hur man hanterar n\u00e4mnda beg\u00e4ran utan att beh\u00f6va st\u00e4lla in intervaller f\u00f6r att stapla f\u00f6rfr\u00e5gningar. Ist\u00e4llet drar du nytta av redan existerande funktioner f\u00f6r att till exempel anropa funktionen igen om det uppst\u00e5r ett fel.<\/p>\n<p>Hur som helst, detta kan vara \u00f6verdrivet f\u00f6r vissa, men f\u00f6r andra som \u00e4r vana vid att anv\u00e4nda <strong>setInterval<\/strong> kan det vara ett mycket b\u00e4ttre s\u00e4tt att hantera Ajax-f\u00f6rfr\u00e5gningar som inte staplas och skickar samma beg\u00e4ran till servern n\u00e4r ett svar redan har skickats lyckades.<\/p>\n<p>Och i slut\u00e4ndan \u00e4r det m\u00e5let: Effektiv kod som h\u00e4mtar den information vi beh\u00f6ver utan att k\u00f6ra ner tredje parts API eller v\u00e5r egen anv\u00e4ndares webbl\u00e4sare.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hur vi kan arbeta korrekt med Ajax-f\u00f6rfr\u00e5gningar s\u00e5 att vi inte staplar upp serverresurser.<\/p>\n","protected":false},"author":1,"featured_media":164534,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,734,922,724,868],"tags":[1173],"class_list":["post-229804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-javascript-9","category-oevrig","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=229804"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164534"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}