我正在使用 $.Deferred
方法尝试获取一个函数来加载一些 Json,处理结果,然后将值传递回另一个将使用结果的函数(在此如果我期望一个整数)。由于某种原因,我可以使用 alert
或 console.log
函数显示此整数,但是当将其用作实际函数的返回值时,代码会下降并返回未定义
。
这是我的代码供引用:
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 调用中调用仪表更新函数 - 所有这些 promise 似乎都是毫无意义的干扰,只是传递正确的信息:
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(),并在该调用中传递“当前”或“预计”,以便显示正确的数据。我浪费了一周的时间来研究这个,这感觉很愚蠢,但希望这个答案对其他人有帮助。您无法从这些 promise 中提取数据,但您可以调用另一个函数(在我的例子中为 gauge5.update)并向其发送您想要使用的值。
最佳答案
您在回调中返回“数据”,而不是在函数 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?
关于javascript - 我可以获得从 $.Deferred() 返回的可在显示中使用的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602488/