[英]Javascript- Use function for string.replace replacement text
我試圖通過調用縮短網址的函數來替換字符串中的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
始終為null。
text.Replace不會改變text =>你需要說text = text.Replace(...)因為javascript中的字符串是不可變的( https://stackoverflow.com/q/51193/4572了解更多信息)
getJSON是異步執行的,這意味着您要替換的函數的執行將啟動JSON調用但不等待JSON調用完成,您需要使用$ .ajax而不關閉async選項(請參閱代碼下面,以及這個鏈接: 是否可以設置async:false到$ .getJSON調用 )
因為JSON調用只是執行一個回調(即函數(結果)),所以它實際上並不返回一個值,所以你需要創建一個所謂的“閉包”,以便從你的內部獲取狀態(result.data.url) function(result)調用父作用域(在本例中是函數($ 1)創建的作用域)。 閉包可能會變得非常混亂,尤其是在javascript中,有時會產生非顯而易見的結果。 謝天謝地,這是一個簡單的閉包。 有關更多信息,您可以查看此https://stackoverflow.com/q/7363168/4572或谷歌。
這是適合我的代碼:
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;
};
由於您調用的函數不是同步的,因此您需要某種回調函數。 以下代碼應該可以解決問題:
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);
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.