解决了:
我可以通过将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>