无法从函数内部获取 return 值
Unable to return value from inside a function
这个函数不允许我在函数外传递数据。
它 return 是正确的数据,但每当我尝试将它添加到数组或函数外部的类似内容时,它不会 return 任何东西。
我知道一些多余的 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
}
});
});
});
编辑
这是我试图提取的函数(根据 romy 的回答进行了更改)以进一步说明:我正在构建一个带有化身的联系人名单。
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>");
}
您处于 async/deferred 执行模式。
我看不出像您那样对 return 有任何好处(它也不会起作用):
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);
这个函数不允许我在函数外传递数据。 它 return 是正确的数据,但每当我尝试将它添加到数组或函数外部的类似内容时,它不会 return 任何东西。 我知道一些多余的 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
}
});
});
});
编辑
这是我试图提取的函数(根据 romy 的回答进行了更改)以进一步说明:我正在构建一个带有化身的联系人名单。
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>");
}
您处于 async/deferred 执行模式。
我看不出像您那样对 return 有任何好处(它也不会起作用):
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);