2012-12-12 29 views
5

固定!ありがとう!下記の「修正されたコード」を参照してください。jQuery戻り値が定義されていません

目的は、ダイアログボックスからデータを取得することです。私は多くの記事を見てきましたが、それらのいずれかを動かすことができなかったので、Webサービスを使用してダイアログボックスと基礎ページの間でデータをやりとりすることにしました。

Webサービスから戻ってくる値を読み取るコードを除いて、すべてのコードが使用されています。デバッガでデータが戻ってきているのがわかりますが、呼び出し元に戻ったときに返されるデータは未定義です。

jQuery関数getLocalはAJAXを呼び出し、正常なデータを取得しますが、それを呼び出す関数(verbListShow)に戻ると、返される値は「未定義」です。

これは、主にjQueryで記述されたASP.NETページで発生しており、jQueryダイアログボックスを開きます。

function getLocal(name) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      var rtn = data.d; 
      return rtn; 
     } 
    }); 
} 

上記のコードは動作しますが、呼び出されるとrtnは未定義です。

function verbListShow(dutyNumber) { 

    $('#dlgDutyList').dialog({ 
     modal: true, 
     show: "slide", 
     width: 250, 
     height: 250, 
     open: function (event, ui) { 
      setLocal("DUTYNUMBER", dutyNumber); 
     }, 
     buttons: { 
      "Select": function() { 
       var id = getLocal("VERBID"); // <*** Returns undefined 
       var verb = getLocal("VERB"); // <*** Returns undefined 
       $.ajax({ 
        type: "POST", 
        async: false, 
        url: "WebServices/FLSAService.asmx/SetDuty", 
        dataType: 'json', 
        contentType: 'application/json; charset=utf-8', 
        data: JSON.stringify({ dutyNum: dutyNumber, id: id, verb: verb }), 
        success: function (data) { 
         data = $.parseJSON(data.d); 
         if (data.ErrorFound) { 
          showMessage(data.ErrorMessage, 2, true); 
         } 
         else { 
          log('Set Duty: ' + data.StringReturn + ' (' + data.intReturn + ')'); 
         } 
        }, 
        error: function (XMLHttpRequest, textStatus, errorThrown) { 
         alert("updateDuty: " 
          + XMLHttpRequest.responseText); 
        } 
       }); 

       $(this).dialog("close"); 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
      } 
     } 

    }); 
    $('#dlgDutyList').dialog('open'); 

FIXED CODE:

function getLocal(name) { 
var rtn = ""; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      rtn = data.d; 
     } 
    }); 
return rtn; 
} 
+0

名前を投稿するときにWebサービスから返される内容は何ですか?それにはdフィールドがありますか? –

+0

'return rtn;' ajaxの成功のコールバックから戻ることはできません。私は、getLocal関数を使用しないか、jqXHRオブジェクトを返すことをお勧めします。 –

答えて

6

はそれを同期それを使用するAJAXの目的に反し(AJAXは、非同期のJavascriptとXMLの略)ここで、発信者です。

今、あなたはreturn成功メソッドから値をすることはできませんが、変数に格納し、その後

function getLocal(name) { 
    var returnValue; 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      returnValue = data.d; 
     } 
    }); 
    return returnValue; 
} 

しかしdeferred object

を使用することです 適切道ということを返すことができます。
function getLocal(name, resultset) { 
    return $.ajax({ 
     type: "POST", 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      resultset[name] = data.d; 
     } 
    }); 
} 

および

0それを呼び出します
3

$ .ajax関数が非同期動作であるために値を返さないので、私の助言はgetLocalメソッドの2番目のパラメータを "コールバック"とすることです。

適切な方法は、そのようにそれを行うことです。

function getLocal(name, callback) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: "WebServices/FLSAService.asmx/GetLocalVariable", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ name: name }), 
     success: function (data) { 
      var rtn = data.d; 
      callback(rtn); 
     } 
    }); 
} 

次に、あなたのメインのコードは、その(非同期コード)のように見える必要があります:

//some code here 
buttons: { 
      "Select": function() { 
       getLocal("VERBID", function(id) { 
        getLocal("VERB", function(verb) { 
         $.ajax({ 
          type: "POST", 
          async: false, 
          url: "WebServices/FLSAService.asmx/SetDuty", 
          dataType: 'json', 
         //some code here 
        }); 
       }); 
//some code here 

は2を作るために、このコードを改善するためにあなたはjQuery Deferredオブジェクトを使用し、すべてのAjax呼び出しが適切な応答を得た直後に.resolve(data)を実行することができます。

+0

両方のレスポンダーに感謝します。あなたの助けを借りてコードをすばやく手に入れました。 –

関連する問題