2015-04-14 3 views
1

Эта функция не позволяет мне передавать данные вне функции. Он возвращает правильные данные, но всякий раз, когда я пытаюсь добавить его в массив или аналогичный вне функции, он ничего не вернет. Мне известно о некоторых избыточных json-синтаксисах и строках, но, пожалуйста, проигнорируйте это. Ive пытался установить глобальные переменные без везения.Невозможно вернуть значение изнутри функции

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 
      } 
     }); 
    });   
}); 

EDIT
Heres функция им пытаются потянуть (с изменениями от ответа Роми в) для дальнейшего уточнения: я строю 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, спасибо, что нашли время, чтобы помочь, я действительно очень ценю это! , и вы правы, он находится в отложенном режиме. Используя вашу логику, я могу вызвать предупреждение, показывающее правильные данные. Тем не менее, им все еще не удается фактически передать данные во что угодно, как массив или переменная. Ive закончил хранение данных в localstorage и захватил его оттуда. однако это кажется настолько взломанным. Я считаю отложенным, чтобы быть довольно трудно понять, я мог бы найти другую библиотеку, которая сделает это в более прямом усадьбе. – Havihavi

+0

«_im все еще не в состоянии фактически передать данные во все, что можно использовать как массив или переменную _» ----- мой первый образец передает данные в переменную. посмотрите на myResult. –

+0

Im в убытке, извините, как мне кажется, вы передаете эти данные с помощью функции resolve(). Ive обновил мой код до полного monty, так что вы можете посмотреть, если у вас есть время =) – Havihavi

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