2015-04-14 145 views
1

此函数不让我将数据传递到函数外。 它返回正确的数据,但每当我尝试将它添加到数组或类似的函数外,它不会返回任何东西。 我知道一些冗余的json解析和字符串化,但请忽略它。我试图设置全局变量没有任何运气。无法返回函数内部的值

var item.jid = 342323; //example 
p = connection.vCard.get(item.jid); 

p.done(function(vCard) { 
    var json = JSON.stringify(vCard); 
    var json = $.parseJSON(json); 

    $(json).each(function(item,val) { 
     $.each(val,function(k,v) { 
      var json2 = JSON.stringify(v); 
      var obj = JSON.parse(json2); 
      var what = obj.BINVAL; 

      if(what != undefined) { 
       var bgimg = what; 
       bgimg = "data:image/jpeg;base64,"+bgimg; 
       //console.log(bgimg); //This returns correct data, but only from within this each loop. 
       //return bgimg; //this does not return anything 
       //arr.push(bgimg);//this does not push anything to array 
       //console.log(item.jid); //does not return global var 
      } 
     }); 
    });   
}); 

编辑
继承人的功能,我尝试拉(与罗密的回答改变)进一步澄清:我建立与造型一contactroster。

var bgimg=null; 
var arr = new Array(); 
function getAvatar(vCard) { 
      var json = JSON.stringify(vCard); 
      var json = $.parseJSON(json); 
       $(json).each(function(item,val){ 
        $.each(val,function(k,v){ 
         var json2 = JSON.stringify(v); 
         var obj = JSON.parse(json2); 
         var what = obj.BINVAL; 
          if(what != undefined){ 
           bgimg = what; 
           bgimg = "data:image/jpeg;base64,"+bgimg; 
           arr.push(bgimg); 
           //console.log(bgimg); //This returns correct data. 
          } 

        }); 
       }); 
     }; 

function getRoster(){ 

connection.roster.requestRoster(function(roster){ 
    var items = roster.getItems(); 
    for(var i = 0; i < items.length; i++){ 
     var arr = new Array(); 
     var item = items[i]; 
     var thejid = item.jid; 
     var thename = item.name; 
     arr.push(thejid); 
     arr.push(thename); 
     p = $.Deferred(); 
     p = connection.vCard.get(item.jid); 
      p.done(function(vCard) { 
       getAvatar(vCard); 
      }); 
     p.resolve(); 
     console.log(arr); 
var theavatar = //This would return whatever the deferred function would throw me. 

     $('.sidebar-nav').append("<li class='contacts'><div id='"+thejid+"' class='avatar' src='"+theavatar+"'></div><a href='#' class='"+thejid+"'>"+thename+"</a></li>"); 

    } 

回答

1

您处于异步/延迟执行模式。

我没有看到任何好处(它不会工作)返回像你一样:

enter image description here

You can use global variable if you want

var d = $.Deferred(); 

var myResult=null; 

d.done(function (a){ myResult=a;}) .done(function(){ alert(window["myResult"])}) 


d.resolve(1); //will alert "1" 

但我更喜欢:

var d = $.Deferred(); 


function doWhatever(x) 
{ 
    //do wtf you want 
    alert(x) 
} 

var myResult=null; 

d.done(function (a){ doWhatever(a)}); 


d.resolve(1); 

http://jsbin.com/potula/1/edit

+0

嘿Royi,感谢您抽出宝贵时间来帮忙,我真的很感激! 你说得对,它处于延期模式。使用你的逻辑,我能够触发显示正确数据的警报。然而,即时通讯仍然无法将数据实际传递到任何可用的数组或变量。 我最终将数据存储在localstorage中,并从那里抓取它。然而,这感觉很不好。 我发现推迟是很难理解,我可能会找到另一个图书馆,在一个更直接的庄园。 – Havihavi

+0

“_im仍然无法将数据实际传递到任何可用的数组或变量_”-----我的第一个示例将数据传递给变量。看看myResult。 –

+0

我很茫然,对不起,它看起来对我来说是通过resolve()函数传递数据的。我更新了我的代码到完整的monty,所以你可以看看如果你有时间=) – Havihavi