今回は、複数の非同期 Ajax リクエストによって引き起こされるコードの入れ子の問題を解決する方法を説明します。以下は実際的なケースですので、一緒に見てみましょう。
問題フロントエンドの学生がページを作成していたとき、彼らはよくある間違いを犯しました。それは、複数の Ajax リクエストを順番に書き留め、後続のリクエストが前のリクエストの戻り結果に一定の影響を及ぼしたことです。依存。以下のコードに示すように:
var someData; $.ajax({ url: '/prefix/entity1/action1', type: 'GET' , async: true, contentType: "application/json", success: function (resp) { //do something on response someData.attr1 = resp.attr1; }, error: function (XMLHttpRequest, textStatus, errorThrown) { //在这个页面里,所有的请求的错误都做同样的处理 if (XMLHttpRequest.status == "401") { window.location.href = '/login.html'; } else { alert(XMLHttpRequest.responseText); } } }); $.ajax({ url: '/prefix/entity2/action2', type: 'POST' , dataType: "json", data: JSON.stringify(someData), async: true, contentType: "application/json", success: function (resp) { //do something on response }, error: function (XMLHttpRequest, textStatus, errorThrown) { //在这个页面里,所有的请求的错误都做同样的处理 if (XMLHttpRequest.status == "401") { window.location.href = '/login.html'; } else { alert(XMLHttpRequest.responseText); } } });
上記のコードには 2 つの問題があります:
*まず、action2 は action1 が返される前に発行される可能性があり、その結果、パラメーター someData.attr1 が失われます。正しく送信されました
*第二に、2 つの ajax リクエストのコードの重複は非常に深刻です
感想
//url:地址 //data:数据对象,在函数内部会转化成json串,如果没传,表示用GET方法,如果传了,表示用POST方法 function ajax(url, data, callback) { $.ajax({ url: url, type: data == null ? 'GET' : 'POST', dataType: "json", data: data == null ? '' : JSON.stringify(data), async: true, contentType: "application/json", success: function (resp) { callback(resp); }, error: function (XMLHttpRequest, textStatus, errorThrown) { if (XMLHttpRequest.status == "401") { window.parent.location = '/enterprise/enterprise_login.html'; self.location = '/enterprise/enterprise_login.html'; } else { alert(XMLHttpRequest.responseText); } } }); }
ajax('/prefix/entity1/action1',null, function(resp){ //do something on response someData.attr1 = resp.attr1; ajax('/prefix/entity2/action2', someData, function(resp){ //do something on response } };
非同期呼び出しの表現を同期呼び出しのように見せる方法を見つける必要があります。
最近たまたま阮宜峰先生の ES6 に関する本を読みましたが、ユーザーは
IE ブラウザとの互換性を主張しなかったため、Promise ソリューションを選択しました
ソリューション
function ajax(url, data, callback) { var p = new Promise(function (resolve, reject) { $.ajax({ url: url, type: data == null ? 'GET' : 'POST', dataType: "json", data: data == null ? '' : JSON.stringify(data), async: true, contentType: "application/json", success: function (resp) { callback(resp); resolve(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { if (XMLHttpRequest.status == "401") { window.parent.location = '/enterprise/enterprise_login.html'; self.location = '/enterprise/enterprise_login.html'; } else { alert(XMLHttpRequest.responseText); } reject(); } }); }); return p; }
ajax('/prefix/entity1/action1',null, function(resp){ //do something on response someData.attr1 = resp.attr1; }).then( ajax('/prefix/entity2/action2', someData, function(resp){ //do something on response } ).then( initVue() ; ).then( //do something else )
推奨読書:
C と View の間でデータを通信する方法Ajax の対話中に報告された status=parsererror エラーを解決する方法以上が複数の非同期 Ajax リクエストによって引き起こされるコードのネストを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。