2013-06-10 4 views
2

Я звоню функцию, которая делает ajax GET к URL, например:

// parameters = url, callback, boolean 
that.mapUrl(window.location.search, function(spec) { 
    console.log("initial mapping done"); 
    console.log(spec); 
    // do stuff 
    }, true); 

mapUrl вызовет запрос Ajax. Внутри обработчика Ajax done или success, я хочу, чтобы вызвать мою функцию обратного вызова, но делает это так:

$.ajax({ 
    method: 'GET', 
    url: obj[1], 
    context: $('body') 
    }).fail(function (jqXHR, textStatus, errorThrown) { 
    console.log("FAILED"); 
    configuration = { 
     "errorThrown":errorThrown, 
     "textStatus": textStatus, 
     "jqXHR": jqXHR 
    }  
    }).done(function(value, textStatus, jqXHR) { 
    console.log("OK"); 
    console.log(callback) // undefined! 
    configuration = { 
     "value":value, 
     "textStatus": textStatus, 
     "jqXHR": jqXHR 
    } 
    }); 

Вопрос:
Так мне интересно, как передать свою функцию обратного вызова в ajaxdone-callback , есть идеи как это сделать?

Спасибо!

EDIT
Вот полный mapURL функция

that.mapUrl = function (spec, callback, internal) { 
    var key, 
    obj, 
    parsedJSON, 
    configuration = {"root" : window.location.href}; 

    if (spec !== undefined && spec !== "") { 
    obj = spec.slice(1).split("="); 
    key = obj[0]; 
    console.log(key); 
    switch (key) { 
    case "file": 
     $.ajax({ 
     method: 'GET', 
     url: obj[1], 
     context: $('body') 
     }).fail(function (jqXHR, textStatus, errorThrown) { 
     console.log("FAILED"); 
     configuration = { 
      "errorThrown":errorThrown, 
      "textStatus": textStatus, 
      "jqXHR": jqXHR 
     } 
     }).done(function(value, textStatus, jqXHR) { 
     console.log("OK"); 
     configuration = { 
      "value":value, 
      "textStatus": textStatus, 
      "jqXHR": jqXHR 
     } 
     }); 
     break; 
    default: 
     // type not allowed, ignore 
     configuration.src = []; 
     break; 
    } 
    } 
    return configuration; 
}; 
+2

Можете ли вы поделиться объявлением метода? MapUrl –

+0

через секунду, вверх – frequent

+0

Вы вызываете метод? Не знаете, в чем проблема. Покажите, что вы пробовали. – epascarello

ответ

3

Было бы лучше вообще сохранить интерфейс «обещание», а не прохождение обратных вызовов в код. Это позволит вам лучше зафиксировать ошибки.

function mapUrl(url) { 
    return $.ajax(...) 
      .fail(...) 
      .then(function(data) { 
       // preprocess data and return it 
      }); 
} 

, где с помощью .then вы можете манипулировать возвращаемые данные, прежде чем он передается в функцию обратного вызова:

Если не удается вызов AJAX, вы можете цепи дополнительные .fail обработчики в этот момент тоже, что ваш текущий API не позволит. Это «разделение проблем» позволит вам использовать более удобный интерфейс обработки ошибок, например, без загромождения вашего кода AJAX кодом, связанным с UI.

+0

приятно. Я попробую. Спасибо – frequent

+0

Ты сделал мой день, сэр! – frequent

+0

@frequent рад помочь! :) – Alnitak

Смежные вопросы