我能够通过将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;
我正在做一个小小的&#34; Tweet This&#34;插件将包含a
元素中包含.tweet-embed
类的任何文本,并通过bit.ly API构建一个带有句子的Twitter链接和当前页面的缩短URL。
我通过我的getShortURL
函数调用了init
函数,并且我试图将其结果附加到{{1}中我的链接的href属性中函数(通过tweetSweep
变量,当前未定义...第39行):
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;
当我调用<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
变量,但无济于事。
我一遍又一遍地搜索并找到了大量关于类似问题的建议,但仍然无法弄清楚如何将其应用到我的代码中。对于所有这些异步和回调爵士乐,我非常无能为力。
答案 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。