如何使用Jquery在.getJSON请求之后对两个数字求和

时间:2014-05-12 10:52:15

标签: jquery json

我已经使用.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);

});

9 个答案:

答案 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();
  });

});

演示:http://jsfiddle.net/6NXYg/

答案 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);
  });
});

jQuery.when()

说明
提供一种基于一个或多个对象执行回调函数的方法,通常是表示异步事件的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);

});

DEMO

NEW Demo

答案 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

http://jsfiddle.net/v8gw6/1/

答案 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);
});

});

Fiddle DEMO