2013-11-19 3 views
2

У меня есть 2 JS литералов:Могу ли я использовать jQuery .done() несколько раз?

var obj1 = { 
    Add: function (id) { 
     $.ajax({ 
      type: "POST", 
      data: JSON.stringify({ 
       "id": id 
      }), 
      url: "Page.aspx/add", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (data) { 
       return jQuery.parseJSON(data.d || "null"); 
      } 
     }); 
    } 
}; 
var obj2 = { 
    List: function (id) { 
     $.ajax({ 
      type: "POST", 
      data: JSON.stringify({ 
       "id": id 
      }), 
      url: "Page.aspx/list", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (data) { 
       return jQuery.parseJSON(data.d || "null"); 
      } 
     }); 
    } 
}; 

И это мой document.ready:

$(document).ready(function() { 
    obj1.Add(1).done(function (data) { 
     alert('you added ' + data); 
    }); 

    obj2.List().done(function (data) { 
     $.each(jQuery.parseJSON(data), function (i, item) { 
      // fill a combo box 
     }); 
    }); 
}); 

JQuery просто выполняет первый вызов и obj2.List() не вызывается вообще. Как правильно использовать дефферируемые объекты в этом случае?

+0

'jQuery.parseJSON' не должно быть необходимо, если у вас есть' DATATYPE: "JSon" ' – sroes

+0

. done используется для ожидания вызова ajax. он работает, но только один раз. – Alex

+0

И почему это сделано предпочтительнее успеха? – mplungjan

ответ

2

Изменить Add и List функция RETURN ajax объект.

Add: function (id) { 
       return $.ajax({.. 

и

List: function (id) { 
     return $.ajax({... 

Этот путь - это вернет jqXHR OBJ, который будет возвращать отложенный объект. Это реализует интерфейс Promise, который имеет: обратные вызовы, которые вы ищете.

редактировать:

look at this simple example which does work :

var obj1 = { 
    Add: function (id) { 
     return $.ajax({ 
      type: "get", 
      data: JSON.stringify({ 
       "id": 1 
      }), 
      url: "http://jsbin.com/AxisAmi/1/quiet", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (data) { 


       alert("at success --"+data.data) 
      } 
     }); 
    } 
}; 

obj1.Add(2).done(function (a){alert("at done --"+a.data);}); 

enter image description here

enter image description here

+0

Теперь он даже не достигает первого вызова. – Alex

+0

@Alex посмотреть, как это работает. теперь ищите ошибки на вашей стороне. –

+1

Проблема была в IIS сбой по какой-то странной причине, потому что она работала правильно. – Alex

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