我正在使用$.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调用中调用仪表更新功能 - 所有这些承诺似乎都是毫无意义的干扰,只是传递正确的信息:< / p>
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)并将其发送给您想要使用的值。
答案 0 :(得分:2)
您正在返回数据&#39;内部回调,而不是函数NewValue。 NewValue应返回promise,NewValue的调用者应在完成此promise时分配回调。
function NewValue(){
var defer = $.Deferred();
var dataPromise = GetDataFromJson();
dataPromise.done(function(data){
//note both console.log(data) and alert(data) deliver the correct result here
deferred.resolve(data);
});
return deferred.promise();
}
NewValue()
.done(function(data){
// do whatever
})
我假设您想要在NewValue函数中进一步处理数据,否则为什么不能直接调用GetDataFromJson?