سؤال

أريد أن أعود StudentId لاستخدامها في مكان آخر خارج نِطَاق التابع $.getJSON()

j.getJSON(url, data, function(result)
{
    var studentId = result.Something;
});

//use studentId here

أتصور أن هذا له علاقة بتحديد النطاق، لكن لا يبدو أنه يعمل بنفس الطريقة ج# يفعل

هل كانت مفيدة؟

المحلول

نعم، إجابتي السابقة لا تعمل لأنني لم أهتم بشفرتك.:)

المشكلة هي أن الوظيفة المجهولة هي وظيفة رد اتصال - أي.getJSON هي عملية غير متزامنة ستعود في وقت غير محدد، لذلك حتى لو كان نطاق المتغير خارج تلك الوظيفة المجهولة (أي.إغلاق)، فلن يكون له القيمة التي تعتقد أنها ينبغي أن تكون:

var studentId = null;
j.getJSON(url, data, function(result)
{
    studentId = result.Something;
});

// studentId is still null right here, because this line 
// executes before the line that sets its value to result.Something

أي كود تريد تنفيذه بقيمة StudentId التي تم تعيينها بواسطة استدعاء getJSON يجب أن يحدث أيضًا داخل وظيفة رد الاتصال هذه أو بعد يتم تنفيذ رد الاتصال.

نصائح أخرى

لا يبدو أنه يعمل بنفس الطريقة التي يعمل بها C#

لإنجاز نطاق مشابه لـ C#، قم بتعطيل العمليات غير المتزامنة وقم بتعيين dataType إلى json:

var mydata = [];
$.ajax({
  url: 'data.php',
  async: false,
  dataType: 'json',
  success: function (json) {
    mydata = json.whatever;
  }
});

alert(mydata); // has value of json.whatever

حتى أبسط من كل ما سبق.كما وضحت سابقا $.getJSON ينفذ غير المتزامن الذي يسبب المشكلة.بدلاً من إعادة هيكلة جميع التعليمات البرمجية الخاصة بك إلى $.ajax الطريقة فقط أدخل ما يلي في الجزء العلوي من ملف .js الرئيسي الخاص بك لتعطيل السلوك غير المتزامن:

 $.ajaxSetup({
   async: false
 });

حظ سعيد!

إذا كنت ترغب في تفويض وظائف أخرى، يمكنك أيضًا توسيع jquery باستخدام $.fn.تدوين مثل ذلك:


var this.studentId = null;

$.getJSON(url, data, 
    function(result){
      $.fn.delegateJSONResult(result.Something);
    }
);

$.fn.delegateJSONResult = function(something){
  this.studentId = something;
}


var context;
$.ajax({
  url: 'file.json',
  async: false,
  dataType: 'json',
  success: function (json) {   
    assignVariable(json);
  }
});

function assignVariable(data) {
  context = data;
}
alert(context);

حسنًا، إذا قمت بإجراء تسلسل لكائن باستخدام ملحق StudentId الممتلكات ثم أعتقد أنه سيكون:

var studentId;
function(json) {
    if (json.length > 0)
        studentId = json[0].StudentId;
}

ولكن إذا كنت تعيد فقط StudentId في حد ذاته ربما يكون:

var studentId;
function(json) {
    if (json.length > 0)
        studentId = json[0];
}

يحرر:أو ربما .length ليس مطلوبًا حتى (لقد قمت فقط بإرجاع المجموعات العامة بتنسيق JSON).

التعديل رقم 2، هذا يعمل، لقد اختبرت للتو:

var studentId;
jQuery.getJSON(url, data, function(json) {
    if (json)
        studentId = json;
});

التعديل رقم 3، هذا هو JS الفعلي الذي استخدمته:

$.ajax({
    type: "POST",
    url: pageName + "/GetStudentTest",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: "{id: '" + someId + "'}",
    success: function(json) {
        alert(json);
    }
});

وفي aspx.vb:

<System.Web.Services.WebMethod()> _
<System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetStudentTest(ByVal id As String) As Integer
    Return 42
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top