我试图通过调用缩短网址的函数来替换字符串中的url,然后替换文本。缩短逻辑工作得很好,我最终得到了正确的替换URL,但是我无法使替换功能正常工作。这是我的代码。
var newtext = shortenUrl(curText);
var shortenUrl = function (text) {
var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;
text.replace(exp,
function ($1) {
$.getJSON("http://api.bitly.com/v3/shorten?login=xxxxxx&apiKey=xxxx&longUrl=" + escape($1) + "&format=json",
function (result) {
return result.data.url;
});
});
return text;
};
result.data.url
根据bit.ly API规范包含适当缩短的url;然而,
由于某种原因,newtext
始终为空。
答案 0 :(得分:4)
text.Replace不会更改text =>的内容你需要说text = text.Replace(...)因为javascript中的字符串是不可变的(https://stackoverflow.com/q/51193/4572以获取更多信息)
getJSON以异步方式执行,这意味着您要替换的函数的执行将启动JSON调用但不等待JSON调用完成,您需要使用$ .ajax而不是async选项已关闭(请参阅下面的代码,以及此链接:Is it possible to set async:false to $.getJSON call)
因为JSON调用只是执行一个回调(即函数(结果)),所以它实际上并不返回一个值,所以你需要创建一个所谓的“闭包”才能获得状态(result.data) .url)从函数内部(结果)调用父作用域(在本例中是函数($ 1)创建的作用域)。闭包可能会变得非常混乱,尤其是在javascript中,有时会产生非显而易见的结果。谢天谢地,这是一个简单的闭包。如需了解更多信息,您可以查看此https://stackoverflow.com/q/7363168/4572或Google。
以下是适合我的代码:
var shortenUrl = function (text) {
var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;
text = text.replace(exp, function ($1) {
var newUrl = "";
$.ajax({
url: "http://api.bitly.com/v3/shorten?login=xxxxx&apiKey=xxxxxx&longUrl=" + escape($1) + "&format=json",
dataType: 'json',
async: false,
success: function(result) {
newUrl = result.data.url
}
});
return newUrl;
});
return text;
};
答案 1 :(得分:0)
由于您调用的函数不是同步的,因此您需要某种回调函数。以下代码应该可以解决问题:
var newtext;
shortenUrl(curText, function(url) {
newtext = url;
});
var shortenUrl = function (text, callback) {
var exp = /(ftp|http|https):\/\/(?!bit\.ly)(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig;
text = text.replace(exp,
function ($1) {
$.getJSON("http://api.bitly.com/v3/shorten?login=xxxxxx&apiKey=xxxx&longUrl=" + escape($1) + "&format=json",
function (result) {
return result.data.url;
});
});
callback(text);
};