我正在使用$.Deferred
方法试图获得一个函数来加载一些Json,处理结果,然后将值传递回另一个将使用结果的函数(在这种情况下,我期望一个整数)。出于某种原因,我可以使用alert
或console.log
函数来显示此整数,但是如果将它用作实际函数的返回值,则代码会覆盖并返回undefined
。
仅供参考,这里是我的代码:
function NewValue(){
var dataPromise = GetDataFromJson();
dataPromise.done(function(data){
//note both console.log(data) and alert(data) deliver the correct result here
return data;
});
}
function GetDataFromJson() {
var jsonData;
var deferred = $.Deferred();
d3.json("http://localhost:8000/pipeline.json", function(dataFromServer){
jsonData = dataFromServer;
headers = ["Won"];
myTotal = 0;
chunks = (headers.map(function(priceRange) {
return jsonData.map(function(d) {
return {y: +d[priceRange]};
});
}));
var myTarget = 10000000;
chunks.forEach(function (arrayItem)
{
var l = 12;
for(var i = 0; i < l; i++) {
myTotal += arrayItem[i].y;
};
});
myTotal = myTotal/myTarget*100;
deferred.resolve(myTotal);
});
return deferred.promise();
}
有没有可能从GetDataFromJson()
返回值,并使用它,否则我会永远只能是能够将其登录到控制台?
编辑通过答题读书要做到这一点的唯一方法后打电话给我GetDataFromJson调用内规更新功能 - 所有这些承诺都看似毫无意义的杂念从刚才路过的权利信息跨越:
function GetDataFromJson(f) {
var jsonData;
var deferred = $.Deferred();
d3.json("http://localhost:8000/pipeline.json", function(dataFromServer){
jsonData = dataFromServer;
if(f == "Current"){
console.log('c');
headers = ["Won"]
} else if(f == "Projected"){
console.log('p');
headers = ["Won", "Prospecting", "Qualifying", "Demonstrating", "Negotiating"]
}
else {
alert('An error has occured')
};
myTotal = 0;
chunks = (headers.map(function(priceRange) {
return jsonData.map(function(d) {
return {y: +d[priceRange]};
});
}));
var myTarget = 10000000;
chunks.forEach(function (arrayItem)
{
var l = 12;
for(var i = 0; i < l; i++) {
myTotal += arrayItem[i].y;
};
});
myTotal = myTotal/myTarget*100;
gauge5.update(myTotal);
deferred.resolve(myTotal);
});
return true;
}
现在我直接通过单击单选按钮来调用GetDataFromJson(),并在该调用中传递“当前”或“预计”,以显示正确的数据。感到愚蠢的是,我一个星期都在研究这个问题,但希望这个答案能够帮助其他人。您无法从这些承诺中提取数据,但可以调用另一个函数(在我的情况下为gauge5.update)并将其发送给您想要使用的值。
你不应该在你的问题中回答。回答你自己的问题是完全有效的 – Liam
我想我会在下面标记答案是正确的,因为它帮助我理解发生了什么 - 然后只更新问题以显示实际的代码。 – Zoinks10
这很好,但如果你有另一个答案,你应该添加一个答案。就目前而言,你已经在问题中提出了你的答案。这是不正确的。问题应该只包含问题 – Liam