解决了:

我可以通过将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);
        });
    }







原始问题:

我正在开发一个小的“ Tweet This”插件,它将使用a类获取包裹在.tweet-embed元素中的所有文本,并通过该位构建一个句子和当前页面的缩短URL的Twitter链接。 .ly API。

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



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

<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();函数时,如果在控制台中键入short,它将按预期吐出缩短的URL。我的问题是我无法弄清楚如何在插件的其他任何地方使用该响应(我试图将其保存到shorturl中的init变量中无济于事)...

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

最佳答案

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



(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>

10-08 18:03