سؤال

أنا أحاول من مدونة كما

function search(query) {
    var dfr = $.Deferred();
    $.ajax({
        url: "http://search.twitter.com/search.json",
        data: {
            q: query
        },
        dataType: 'jsonp',
        success: dfr.resolve
    });
    return dfr.promise();
}

Test = {
    start: function(){
        alert("Starting");
    }
};

function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

$.when(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);

هذا يعمل كما هو متوقع.ومع ذلك عندما أكتب على أنها:

Test.start()
    .then(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv);

انها مجرد تنبيهات "انطلاق" و ينهي.على سبيل المثال العمل يمكن العثور عليها في http://jsfiddle.net/XQFyq/2/.ما الخطأ الذي فعلته ؟

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

المحلول

Test ليس المؤجلة كائن, حتى لا يكون وسيلة .then(). .when() هو a المؤجلة كائن وبالتالي لماذا يعمل عند الاتصال .when().

الخاص بك $.ajax() الاتصال هو a المؤجلة كائن, لذا إذا كنت العودة كجزء من الخاص بك 'Test.start() الطريقة ، يمكنك إضافة .then() رد (انظر على سبيل المثال هنا), ، .then() رد سوف يطلق مرة واحدة على اياكس الاتصال قد تم حلها ، أيعاد البيانات ، ومع ذلك ليس هذا هو الاستخدام الصحيح المؤجلة كائن لا أعتقد.وفيما يلي أكثر كيف يعتزم استخدامها أعتقد:

function searchTwitter(query){
    $.ajax({
            url: "http://search.twitter.com/search.json",
            data: {
                q: query
            },
            dataType: 'jsonp',
            success: function(data){return data;}
        })
        .then(gotresults)
        .then(showDiv)
        .fail(showFailDiv);
};

function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

function showFailDiv() {
    $('<div />').html("Results <b>NOT</b> received").appendTo('body');
}

// Starting can be done with a click:

$("#searchTwitter").click(function(){
   searchTwitter($("#searchName").val()); 
});

// OR a static call:
searchTwitter("ashishnjain");

ترى العمل هنا

إذا كنت تريد إرجاع البيانات على سبيل المثال showDiv() تغييره إلى showDiv(data).....


هنا هو مثال آخر على كيف يمكنك إنشاء الخاصة بك المؤجلة كائن بدلا من الاعتماد على المؤجلة كائن من .ajax() المكالمة.هذا هو قليلا أقرب إلى الأصلي الخاص بك على سبيل المثال - إذا كنت تريد أن ترى ذلك الفشل على سبيل المثال ، تغيير عنوان url http://DONTsearch.twitter.com/search.json على سبيل المثال هنا:

var dfr;

function search(query) {
    $.ajax({
        url: "http://search.twitter.com/search.json",
        data: {
            q: query
        },
        dataType: 'jsonp',
        success: function(data){dfr.resolve(data);},
        error:  function(){dfr.reject();}
    });
}

Test = {
    start: function(){
        dfr = $.Deferred();
        alert("Starting");
        return dfr.promise();        
    }
};


function gotresults(data) {
    alert(data.max_id);
}

function showDiv() {
    $('<div />').html("Results received").appendTo('body');
}

function showFailDiv() {
    $('<div />').html("Results <b>NOT</b> received").appendTo('body');
}

Test.start()
    .then(search('ashishnjain'))
    .then(gotresults)
    .then(showDiv)
    .fail(showFailDiv);

تحديث للرد على التعليقات:

في الإصدار 11, أنت لن تخبر المؤجلة كائن من الفشل ، لذلك لن اتصل .fail() رد.لتصحيح هذا استخدام اياكس التفسير إذا .fail() (error:.......) لتقديم المشورة المؤجلة كائن من الفشل error: drf.reject - هذا سيتم تشغيل .fail() رد.

أما السبب كنت ترى ShowMoreCode() تشغيل مباشرة ، .then() المكالمات الاسترجاعات ، إذا كنت تمر تمثيل سلسلة وظيفة مثل: .then(ShowDiv) وعندما يأتي بدوره رد سوف ابحث عن وظيفة بهذا الاسم.إذا كان يمكنك تمرير المكالمات إلى وظيفة .then(someMoreCode('Ashish')) أنه سيتم تشغيل وظيفة.حاول تغيير .then(showDiv) إلى .then(showDiv()) ستلاحظ بمجرد تشغيل التعليمات البرمجية ، وسوف تظهر رمز من showDiv().

إذا قمت بتغيير .then(ShowMoreCode('Ashish')) إلى .then(ShowMoreCode), يمكنك الوصول إلى البيانات التي تم إرجاعها من $.ajax() المكالمة.مثل هذا:

function someMoreCode(name) {
    alert('Hello ' + name.query);
}

نلقي نظرة هنا: العمل و لا يعمل .fail()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top