如何使用$ .getJSON的结果?

时间:2016-03-05 00:04:00

标签: javascript jquery ajax

解决:

我能够通过将tweetSweep函数的内部包装在回调函数(下面的代码段)中来解决问题。

这有效,但我很乐意听到是否有其他方法可供使用。



    // URL Constructor ---------- //
    tweetSweep: function() {
      this.getShortUrl(function(short) {
        for(var i = 0; i < s.tweets.length; i++) {
          
          var tweet = $(s.tweets[i]);
          var tweet_text = $(tweet).text();
          
          // Build the URL
          $(tweet).attr({
            href: s.tweet_url + tweet_text + ' ' + short + s.tweet_source,
            target: '_blank'
            });
          }
      });
    },

    // URL Shortening via Bitly API ---------- //
    getShortUrl: function(callback) {
       var accessToken = s.bitly_key;
       var url = 'https://api-ssl.bitly.com/v3/shorten?access_token=' + accessToken + '&longUrl=' + s.post_url;

        $.getJSON(url, function(response) {
            callback(response.data.url);
        });
    }
&#13;
&#13;
&#13;

原始问题:

我正在做一个小小的&#34; Tweet This&#34;插件将包含a元素中包含.tweet-embed类的任何文本,并通过bit.ly API构建一个带有句子的Twitter链接和当前页面的缩短URL。

我通过我的getShortURL函数调用了init函数,并且我试图将其结果附加到{{1}中我的链接的href属性中函数(通过tweetSweep变量,当前未定义...第39行):

&#13;
&#13;
shorturl
&#13;
(function() {

  /**
   * Main TweetEmbed object with settings
   * and helper functions to build "Tweet this"
   * links around desired text.
   * 
   * @type {Object}
   */
  
  var TweetEmbed = {

    // Settings ---------- //
    settings: {
      tweets: $('.tweet-embed'),
      tweet_url: 'http://twitter.com/home/?status=',
      tweet_source: ' — @handle',
      post_url: window.location.href,
      bitly_login: 'my_login_is_here',
      bitly_key: 'my_key_is_here'
    },

    // Initialization ---------- //
    init: function() {
      s = this.settings;
      this.tweetSweep();
      this.getShortUrl(s.post_url);
    },

    // URL Constructor ---------- //
    tweetSweep: function() {
      for(var i = 0; i < s.tweets.length; i++) {
        
        var tweet = $(s.tweets[i]);
        var tweet_text = $(tweet).text();
        
        // Build the URL
        $(tweet).attr({
          //href: s.tweet_url + tweet_text + s.tweet_source + shorturl,
          href: s.tweet_url + tweet_text + s.tweet_source,
          target: '_blank'
          });
        }
    },

    // URL Shortening via Bitly API ---------- //
    getShortUrl: function(url, callback) {
       var accessToken = s.bitly_key;
       var url = 'https://api-ssl.bitly.com/v3/shorten?access_token=' + accessToken + '&longUrl=' + encodeURIComponent(url);

        $.getJSON(url, function(response) {
            short = response.data.url;
        });
    }

  }; // end TweetEmbed

  // Fire off TweetEmbed's initialization 
  TweetEmbed.init();
})();
&#13;
&#13;
&#13;

当我调用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <a class="tweet-embed">Test tweet here</a>函数时,如果我在控制台中键入getShortUrl();,它将按预期吐出缩短的URL。我的问题是,我无法弄清楚如何在我的插件中的任何其他地方使用该响应(我试图将其保存到short中的shorturl变量,但无济于事。

我一遍又一遍地搜索并找到了大量关于类似问题的建议,但仍然无法弄清楚如何将其应用到我的代码中。对于所有这些异步和回调爵士乐,我非常无能为力。

2 个答案:

答案 0 :(得分:1)

tweetSweet可以使用可选的shorturl参数,默认为空字符串。然后在$.getJSON回调中,您可以致电tweetSweep以使用API​​的响应更新所有网址。

(function() {

  /**
   * Main TweetEmbed object with settings
   * and helper functions to build "Tweet this"
   * links around desired text.
   *
   * @type {Object}
   */

  var TweetEmbed = {

    // Settings ---------- //
    settings: {
      tweets: $('.tweet-embed'),
      tweet_url: 'http://twitter.com/home/?status=',
      tweet_source: ' — @handle',
      post_url: window.location.href,
      bitly_login: 'my_login_is_here',
      bitly_key: 'my_key_is_here'
    },

    // Initialization ---------- //
    init: function() {
      s = this.settings;
      this.tweetSweep();
      this.getShortUrl(s.post_url);
    },

    // URL Constructor ---------- //
    tweetSweep: function(shorturl) {
      if (!shorturl) {
        shorturl = '';
      }
      for (var i = 0; i < s.tweets.length; i++) {

        var tweet = $(s.tweets[i]);
        var tweet_text = $(tweet).text();

        // Build the URL
        $(tweet).attr({
          href: s.tweet_url + tweet_text + s.tweet_source + shorturl,
          target: '_blank'
        });
      }
    },

    // URL Shortening via Bitly API ---------- //
    getShortUrl: function(url) {
      var accessToken = s.bitly_key;
      var url = 'https://api-ssl.bitly.com/v3/shorten?access_token=' + accessToken + '&longUrl=' + encodeURIComponent(url);
      var self = this;

      $.getJSON(url, function(response) {
        var short = response.data.url;
        self.tweetSweep(short);
      });
    }

  }; // end TweetEmbed

  // Fire off TweetEmbed's initialization 
  TweetEmbed.init();
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="tweet-embed">Test tweet here</a>

答案 1 :(得分:0)

您在哪里尝试在插件中使用它?一种选择是使用承诺

https://msdn.microsoft.com/en-us/library/dn802826(v=vs.94).aspx

而不是回调,因为$ .getJSON返回一个promise。