我已经使用.getJSON
函数来获取特定URL的份额和计数,并且我成功获得了份额和计数,但我也想要这两者的总和。这是我制作的fiddle。
这是我使用的Jquery
$(function () {
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html";
$.getJSON(fburl, function (data) {
var fbshares = data["shares"];
$(".facebook").append(fbshares);
});
twitterurl = 'http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
$.getJSON(twitterurl, function (data) {
var twittershares = data["count"];
$(".twitter").append(twittershares);
});
var sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
答案 0 :(得分:1)
您已在fbshares
中指定了twittershares
和$.getJSON
,并尝试在功能之外访问它。所以变量不可用。
在顶部声明它们并尝试访问它。
同时两者都是异步请求,因此它们可能会在两个不同的时间解析。
要克服这一点,您可以使用$.promise , $.when or $.deferred.
以下是$.when
$(function(){
var fbshares, twittershares, sumofboth;
$.when($.getJSON("http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html", function (data) {
fbshares = data["shares"] || 0; // assign 0 if it returns undefined
(".facebook").append(fbshares);
}), $.getJSON("http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?", function (data) {
twittershares = data["count"] || 0; // assign 0 if it returns undefined
$(".twitter").append(twittershares);
}).done(function(){
sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
});
答案 1 :(得分:1)
上述示例不起作用的原因是您以异步方式发出每个请求。也就是说,在检索结果之前,您将获得汇总结果的代码。
如果您依次进行每个查询并在所有查询完成后对结果求和,则效果会更好。
检查一下。 http://jsfiddle.net/Wm9M3/1037/
$(function () {
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html";
var twitterurl = 'http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
// first make your request for the facebook info
$.getJSON(fburl, function (data) {
var fbshares = data["shares"];
$(".facebook").append(fbshares);
// once the FB info is complete get the twitter info
$.getJSON(twitterurl, function (data) {
var twittershares = data["count"];
$(".twitter").append(twittershares);
// once we are here both FB and Twitter info has been retrieved
// lets summarize them
var sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
});
});
答案 2 :(得分:1)
由于请求是异步的,您必须等到两个响应都到达才能计算总和。在成功处理程序之外声明变量,以便每个变量可以检查对方是否已到达,并让最后一个到达显示总和:
$(function () {
var fbshares = null;
var twittershares = null;
function showSum() {
var sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
}
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html";
$.getJSON(fburl, function (data) {
fbshares = data["shares"];
$(".facebook").append(fbshares);
if (twittershares != null) showSum();
});
twitterurl = 'http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
$.getJSON(twitterurl, function (data) {
twittershares = data["count"];
$(".twitter").append(twittershares);
if (fbshares != null) showSum();
});
});
答案 3 :(得分:0)
您必须在函数之外定义变量 fbshares, twittershares
:
$(function () {
var fburl = "http://graph.facebook.co........multi.html",
twitterurl = 'http://urls.api.twitter.com/.....html&callback=?',
fbshares,
twittershares,
sumofboth; // declare it here to access
$.getJSON(fburl, function (data) {
fbshares = data["shares"] || 0; // update the var value here
$(".facebook").append(fbshares);
}).promise().done(function(){ // use promise to wait for values to get set
sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
$.getJSON(twitterurl, function (data) {
twittershares = data["count"] || 0; // update the var value here
$(".twitter").append(twittershares);
}).promise().done(function(){ // use promise to wait for values to get set
sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
});
由于 Guffa 建议未设置值,因为有两个调用是异步的,因此设置值需要时间,因此您必须使用.promise()
才能完成在done函数中,我们将添加值并设置它们。
另一种解决方案是以这种方式使用jQuery.when()
方法:
$(function () {
var fburl = "http://graph.facebook.co........multi.html",
twitterurl = 'http://urls.api.twitter.com/.....html&callback=?',
fbshares,
twittershares,
sumofboth; // declare it here to access
$.when($.getJSON(fburl, function (data) {
fbshares = data["shares"] || 0; // update the var value here
$(".facebook").append(fbshares);
}), $.getJSON(twitterurl, function (data) {
twittershares = data["count"] || 0; // update the var value here
$(".twitter").append(twittershares);
}).done(function(){
sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
});
});
说明强>
提供一种基于一个或多个对象执行回调函数的方法,通常是表示异步事件的Deferred对象。
答案 4 :(得分:0)
您的变量范围在外面不可见,并且在请求获取后您必须使用该变量
$(function () {
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html";
var checker = 0;
var fbshares, twittershares;
$.getJSON(fburl, function (data) {
fbshares = data["shares"];
$(".facebook").append(fbshares);
checker += 1;
});
twitterurl = 'http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
$.getJSON(twitterurl, function (data) {
twittershares = data["count"];
$(".twitter").append(twittershares);
checker += 1;
});
var cache = setInterval(function () {
if (checker == 2) {
var sumofboth = fbshares + twittershares;
$(".sum").append(sumofboth);
clearInterval(cache);
}
}, 100);
});
答案 5 :(得分:0)
你有几个问题。 1)变量范围 2)忽略ajax调用的异步性质
以下代码适合您
$(function () {
//twittershares and fbshares variables made global
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html",
twitterurl,
fbshares = -1,
twittershares,
sumofboth,
interval;
$.getJSON(fburl, function (data) {
fbshares = data["shares"];
$(".facebook").append(fbshares);
});
twitterurl = 'http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
$.getJSON(twitterurl, function (data) {
twittershares = data["count"];
$(".twitter").append(twittershares);
//fb ajax request isn't guaranteed to have returned response so check for fb response every 250 milliseconds and update div
interval = window.setInterval(function () {
if (fbshares != -1) {
sumofboth = parseInt(fbshares, 10) + parseInt(twittershares, 10);
$(".sum").append(sumofboth);
window.clearInterval(interval);
}
}, 250);
});
});
答案 6 :(得分:0)
此处的问题是async=true
的{{1}}
你必须在第一个getJSON
内完成所有事情。
或者使用没有异步的ajax
答案 7 :(得分:0)
$。getJSON内部使用jQuery ajax。所以在总结之前确保两个变量都有值。而是使用jquery ajax和async:false
$(function () {
var fburl = "http://graph.facebook.co........multi.html",
twitterurl = 'http://urls.api.twitter.com/.....html&callback=?',
fbshares=0,
twittershares=0; // declare it here to access
$.ajax({url:fburl,async:false, function (data) {
fbshares = data["shares"]; // update the var value here
$(".facebook").append(fbshares);
add(fbShares,twittershares);
}});
$.ajax({url:twitterurl,async:false, function (data) {
twittershares = data["count"]; // update the var value here
$(".twitter").append(twittershares);
add(fbShares,twittershares);
}});
});
function add(a,b)
{
$(".sum").append(a+b);
}
答案 8 :(得分:0)
这是工作代码,把变量放在ajax调用之外,解析Result就像这样浮动:
$(function(){
var fburl = "http://graph.facebook.com/?id=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html";
var fbshares;
var twittershares;
$.getJSON(fburl, function(data){
fbshares = parseFloat(data["shares"]);
$(".facebook").append(fbshares);
});
twitterurl='http://urls.api.twitter.com/1/urls/count.json?url=http://www.bloggerever.com/2014/05/codeanywhere-most-useful-and-multi.html&callback=?';
$.getJSON(twitterurl, function(data){
twittershares = parseFloat(data["count"]);
$(".twitter").append(twittershares);
var sumofboth=fbshares+twittershares;
$(".sum").append(sumofboth);
});
});