عودة $.الحصول على البيانات في وظيفة باستخدام مسج

StackOverflow https://stackoverflow.com/questions/1639555

  •  08-07-2019
  •  | 
  •  

سؤال

أحاول استدعاء دالة التي تحتوي على رمز مسج.أريد هذه الدالة لإرجاع نتائج مسج البيان.فمن لا يعمل و أنا أحاول معرفة السبب.

function showGetResult (name) {
    var scriptURL = "somefile.php?name=" + name;
    return $.get(scriptURL, {}, function(data) { return data; });
}

alert (showGetResult("John"));

التنبيه يعرض "[object XMLHttpRequest]." ومع ذلك ، إذا كنت تشغيل مسج البيان في حد ذاته ، خارج وظيفة, أنه يعمل بشكل جيد -> $.get(scriptURL, {}, function(data) { alert(data); })

أود أن تكون قادرة على إعادة استخدام هذا الرمز من خلال وضعه داخل الدالة التي ترجع $.get البيانات.ما الخطأ الجوهري أنا هنا ؟

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

المحلول

لديك بعض الأخطاء مختلفة. أولا، $. احصل لا يقوم بإرجاع القيمة المرجعة من الدالة رد. تقوم بإرجاع كائن XHR. الثانية، وظيفة الحصول على يست متزامن، فمن غير متزامن بحيث showGetResult من المرجح أن يعود قبل الحصول يكمل. ثالثا، لا يمكنك العودة شيئا من داخل الاستدعاء إلى نطاق الخارجي. يمكنك، ومع ذلك، ربط متغير في نطاق الخارجي ووضعه في رد.

لتحصل على الوظيفة التي تريدها، ستحتاج إلى استخدام $ .ajax وتعيين الخيار المتزامن إلى false. ثم يمكنك تعريف متغير في نطاق الخارجي وتعيين في رد اياكس، والعودة هذا المتغير من وظيفة.

function showGetResult( name )
{
     var result = null;
     var scriptUrl = "somefile.php?name=" + name;
     $.ajax({
        url: scriptUrl,
        type: 'get',
        dataType: 'html',
        async: false,
        success: function(data) {
            result = data;
        } 
     });
     return result;
}

وأنت من المحتمل أن يخدم على نحو أفضل، على الرغم من معرفة كيفية تفعل ما تريد في وظيفة رد الاتصال نفسها بدلا من تغيير من غير المتزامن لدعوات متزامن.

نصائح أخرى

والخطأ الأساسي التي تبذلونها هو أن الدعوة AJAX يتم بشكل متزامن، وذلك في الوقت الذي يعود، والنتيجة ليست جاهزة بعد. لجعل هذا العمل يمكن تعديل التعليمات البرمجية الخاصة بك مثل هذا:

$(function() {
    showGetResult('John');
});

function showGetResult (name) {
    $.get('somefile.php', { 
        // Pass the name parameter in the data hash so that it gets properly
        // url encoded instead of concatenating it to the url.
        name: name 
    }, function(data) { 
        alert(data); 
    });
}

ويبدو كما لو كنت تريد طلب متزامن: كيف يمكنني الحصول على مسج لإجراء متزامن، بدلا من غير المتزامن، طلب اياكس؟

وأو قد ترغب في تمرير الاستدعاء إلى وظيفة الخاص بك:

function showGetResult (name, callback) {
  var scriptURL = "somefile.php?name=" + name;
  return $.get(scriptURL, {}, callback);
}

showGetResult("John", function(data){ alert(data); });

والخطأ الأساسي هو الجزء "غير متزامن" من AJAX. لأنك لا تعرف متى خادم سيأخذ أن يرسل إلى الخلف استجابة وأساليب AJAX أبدا "كتلة" - وهذا هو، لا ينادي على الخادم ومجرد الجلوس هناك في انتظار النتيجة. بدلا من ذلك، تذهب إلى شيء آخر، ولكن قمت بإعداد وسيلة، ودعا "الاستدعاء"، من شأنها أن النار عندما تأتي النتائج مرة أخرى. هذا الأسلوب هو المسؤول عن القيام بكل ما يجب القيام به مع البيانات (على سبيل المثال عن طريق الحقن عليه في الصفحة).

هذا هو الطريق الخطأ القيام به.وظيفة(البيانات) هو استدعاء دالة أخرى لذلك كلما عودة $.الحصول على سيتم تنفيذ ..هناك احتمال أن استدعاء دالة أخرى قد لا يسمى.

أفضل استدعاء البيانات وظيفة الخاص بك الحصول على وظيفة من خلال وظيفة(البيانات) الأسلوب.

وهناك طريقة فعالة لاستخدام طريقة المؤجلة مسج، سواء متزامنة / طلبات المتزامن إلى خادم وانتظر deferred.resolve () ثم إرجاع الكائن وعد مؤجل. تبدو مملة بعض الشيء، ولكن دراسة صغيرة هي بالتأكيد مفيدة للبيانات الكبيرة. (وظيفة tvanfosson ويعمل بشكل جيد في هذه الحالة، ولكن عندما كنت أعمل على بيانات تحليلات جوجل، وكمية كبيرة من المعلومات جعلني مجنون، وبالتالي لست بحاجة لإيجاد هذا الحل)

     function showResults(name) { 
        var deferred = $.Deferred, requests = [];

        requests.push($.ajax({url:"/path/to/uri/?name=" + name, type: "GET", async: false}).done(function(d) { 
         //alert or process the results as you wish 
        }));
        $.when.apply(undefined, requests).then(function() { deferred.resolve(); }); 
        return deferred.promise();

    }

والكائن وعد عاد يمكن أن تستخدم أيضا مع $.when(showResults('benjamin')).done(function() { }); لآخر التعديلات (مثل إعدادات المخطط / الرسم البياني الخ). يمكن إعادة استخدامها تماما. يمكنك أيضا وضع هذه الوظيفة في حلقة من $ .deferred طلبات مثل،

        function updateResults() { 
             var deferred = $.Deferred, requests = [];
             requests.push($.ajax(url:"/path/to/names/?nameArr=" + jsonArrOfNames, type: "GET", async: false}).done(function(res) {  requests.push(showResults(res[0]));}) );
             $.when.apply($, requests).then(function() { deferred.resolve(); }); 
             return deferred.promise();
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top