2015-02-24 102 views
0

我有功能和AJAX调用更新页面中的内容需要分开,但是在页面加载时,他们需要全部加载,因此我使用$ .when - 但是我理解在函数之间发送数据并使用$ .when是非常糟糕的 - 我已经研究了几种将AJAX调用结合起来的解决方案,并且这些解决方案对我来说似乎都失败了。这是我目前的解决方案:

  1. 我有2个函数运行独立的AJAX请求。
  2. 然后,我不过把这些从$。当
  3. 返回的数据,并以正确的JSON格式(上JSONlint验证) 通过。当$数据未设置/莫名其妙地丢失,在这一点上我传回时,不明白发生了什么。 我可以在AJAX函数中输出数据,但是如果我尝试从$ .when函数内或onload_sendData函数内输出,数据总是变成“未定义”。

我试过JSON.stringify,和JSON.parse都传递给一个函数之前和之后 - 没有什么区别,当我试图传递给下一个函数这种方式后,读它的数据总是会变得不确定。也许我错过了一些关于Javascript如何传递数据的基础知识,希望有人可以提供帮助。

function onload_Categories() { 
    $.ajax({ 
       type: "GET", 
       url: '/index/categories', 
       ContentType : 'application/json', 
       success: function (data1) { 
       return data1; 
       }, 
       error: function (jqXHR, textStatus, errorThrown) { 
       return errortThrown; 
       } 
      }) 
} 

function onload_Subscribed() { 
    return $.ajax({ 
       type: "GET", 
       url: '/index/getsubscribed', 
       ContentType : 'application/json', 
       success: function (data2) { 
       return data2; 
       }, 
       error: function (jqXHR, textStatus, errorThrown) { 
       return errortThrown; 
       } 
      }) 
} 

function onload_sendData(data1) { 
    alert(data1); // "UNDEFINED" 
    //processCategories(data1); // send data to populate the page categories 
    //processSubscribed(data2); // send data to populate the subscription data 
} 

    (function($){ 
     $(window).load(function(){ 

V1

$.when(onload_Categories(),onload_Subscribed()).then(onload_sendData); 

V2

$.when(onload_Categories(),onload_Subscribed()).then(function(data1,data2){ 


    alert(data1); // "UNDEFINED" 
    alert(JSON.parse(data1); // "UNDEFINED" 

    }) 

    }) 
}) 

下面是从类别AJAX功能检索的JSON数据的一个片段:

> [{"categorytitle":"accessories","category_id":"56","parent":"7","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"accessories","category_id":"64","parent":"9","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"accessories","category_id":"72","parent":"11","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"activities","category_id":"57","parent":"7","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"activities","category_id":"81","parent":"15","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"appliances","category_id":"83","parent":"16","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"apps","category_id":"4","parent":"0","count":2,"p_count":2,"ad_ids":"25,27,","rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"auto","category_id":"18","parent":"0","count":1,"p_count":3,"ad_ids":"27,","rem_ads_age":0,"rem_ads_loc":0,"hassub":1},{"categorytitle":"bags","category_id":"32","parent":"1","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"belts","category_id":"25","parent":"1","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"body 
> care","category_id":"3","parent":"0","count":0,"p_count":1,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":1},{"categorytitle":"body 
> work and 
> \n\nrepair","category_id":"101","parent":"18","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"books","category_id":"39","parent":"2","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"business","category_id":"19","parent":"0","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"Business 
> insurance","category_id":"110","parent":"105","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"cafes","category_id":"58","parent":"8","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"cameras","category_id":"88","parent":"16","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"car 
> hire","category_id":"99","parent":"18","count":1,"p_count":1,"ad_ids":"20,","rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"cars","category_id":"98","parent":"18","count":1,"p_count":1,"ad_ids":"20,","rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"computers","category_id":"86","parent":"16","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"computers 
> and 
> tablets","category_id":"90","parent":"16","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"consoles 
> and 
> \n\ngames","category_id":"89","parent":"16","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"cruises","category_id":"63","parent":"9","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0},{"categorytitle":"cufflinks","category_id":"27","parent":"1","count":0,"p_count":0,"ad_ids":0,"rem_ads_age":0,"rem_ads_loc":0,"hassub":0}] 

而只是为了彻底,并为你的understan丁 - 以下是工作在传球数据功能之间:

function getCategories($c) { 

    $.when(

     $.get('/index/categories') 

).then(function(categories) { 

    processCategories(categories, $c); 

    }); 

} 

function processCategories(categories, $c) { 

var jsonData = JSON.parse(categories); // data OK 

etc... 
+1

你需要从函数返回的承诺:'返回$阿贾克斯(...)' – Barmar 2015-02-24 17:11:00

+0

你可能有说话从lamens的角度来说,我是一个完全新手......我尝试了这个,但仍然没有运气$。阿贾克斯({ 类型: “GET”, 网址: '/指数/类别', 的ContentType: '应用/ JSON', 成功:功能(数据1){ 回报$阿贾克斯(数据1); – Mike 2015-02-24 17:13:58

+0

你已经带领我走向正确的方向我想我已经发现了你的意思,谢谢! – Mike 2015-02-24 17:17:37

回答

0

对于任何人谁可能会好奇 - AJAX的需要是specically returnd像这样:

return $.ajax({ 
       type: "GET", 
       url: '/index/getsubscribed', 
       ContentType : 'application/json', 
}) 

,并使用这些数据,你需要引用第一个索引,因为AJAX响应是一个数组。

 $.when(
      onload_Categories(), 
      onload_Subscribed() 
     ).then(function(data1,data2) { 
      var categories = data1[0]; 

// 0 - is your data, 1 - AJAX fail/success response, 2 - other ajax response object data. 
       processCategories(categories); 
      var subscribed = data2[0]; 
       processSubscribed(subscribed); 

      }) 

大概基本的东西,但失去了我生命中的几个小时,因为我是相当新的这一点,希望它可以帮助别人。

UPDATE:

我的服务器将不接受2以单$。当语句获取 - 第二届总会收到500内部服务器错误 - 没有身体我看到已经堆放了$。当声明,但是这似乎是它是唯一的解决方案,很适合我......

$.when(
      onload_Categories() 
     ).then(function(data) { 
      var categories = data; 
      alert(categories); 
       processCategories(categories); 
       $.when(
       onload_Subscribed() 
       ).then(function(data) { 
        var subscribed = data; 
        alert(subscribed); 
        processSubscribed(subscribed); 
       }) 
      }) 
相关问题