Jquery 无法从函数内部返回值
此函数不允许我在函数外部传递数据。 它返回正确的数据,但每当我尝试将其添加到函数外部的数组或类似对象时,它都不会返回任何内容。 我知道一些冗余的json解析和字符串化,但请忽略这一点。我尝试过设置全局变量,但运气不好Jquery 无法从函数内部返回值,jquery,variables,return-value,Jquery,Variables,Return Value,此函数不允许我在函数外部传递数据。 它返回正确的数据,但每当我尝试将其添加到函数外部的数组或类似对象时,它都不会返回任何内容。 我知道一些冗余的json解析和字符串化,但请忽略这一点。我尝试过设置全局变量,但运气不好 var item.jid = 342323; //example p = connection.vCard.get(item.jid); p.done(function(vCard) { var json = JSON.stringify(vCard); v
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
}
});
});
});
编辑下面是我试图使用的功能(与罗米的答案有所不同),以进一步澄清:我正在与阿凡达建立一个联系人名单
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>");
}
var bgimg=null;
var arr=新数组();
功能getAvatar(vCard){
var json=json.stringify(vCard);
var json=$.parseJSON(json);
$(json).each(函数(项,val){
$。每个(val,函数(k,v){
var json2=JSON.stringify(v);
var obj=JSON.parse(json2);
var what=obj.BINVAL;
如果(什么!=未定义){
bgimgwhat;
bgimg=“数据:图像/jpeg;base64,”+bgimg;
arr.push(bgimg);
//console.log(bgimg);//返回正确的数据。
}
});
});
};
函数getRoster(){
连接.花名册.请求花名册(功能(花名册){
var items=花名册.getItems();
对于(变量i=0;i”;
}
您处于异步/延迟执行模式
我看不到像你这样回报有任何好处(也不会起作用):
:
但我更喜欢:
var d = $.Deferred();
function doWhatever(x)
{
//do wtf you want
alert(x)
}
var myResult=null;
d.done(function (a){ doWhatever(a)});
d.resolve(1);
嘿,罗依,谢谢你花时间帮忙,我真的非常感谢!你说得对,它处于延迟模式。使用你的逻辑,我能够触发一个警报,显示正确的数据。但是,我仍然无法将数据实际传递到任何可用的东西,如数组或变量。我最终将数据存储在本地存储器中d从那里抓取数据。然而,这感觉太粗糙了。我发现延迟很难理解,我可能会找到另一个更直接的库来实现它。“我仍然无法将数据传递到任何可用的东西,比如数组或变量。”-----我的第一个示例确实将数据传递给了一个变量。看看我的结果。我不知道,对不起,我觉得它是通过resolve()函数传递数据的。我已将我的代码更新到完整的月份,所以如果有时间,可以看一看。)解析只是点燃了整个链条。你可以忽略它。我的延迟对象不会调用
done
,除非有人说某事done
这就是resolve
要做的。你没有它是因为你使用的API(connection.vCard.get(item.jid);)内部呼叫resolve
。我明白了吗?啊,是的。我现在明白了。哎哟……你觉得有什么办法可以解决吗?不管怎样,谢谢你抽出时间:)
var d = $.Deferred();
function doWhatever(x)
{
//do wtf you want
alert(x)
}
var myResult=null;
d.done(function (a){ doWhatever(a)});
d.resolve(1);