0

私はそれが機能していることを確認するために設定してテストしたグローバル関数を持っています:

function shortenUrl(url) { 
   ...
}

次に、次のような別の関数の変数でその関数を呼び出そうとしています:

var pageLink = $(location).attr('href'),
    shortLink = shortenUrl(pageLink);

したがって、これを実行しようとすると、未定義のエラーが発生します。ただし、pageLink 変数を、jQuery でページの URL を見つけることから、"http://example.com" のようなハードコードされたものに変更し、グローバル関数の値を console.log に変更すると、短縮リンクが返されます。

次のようにリターンコールをコメントアウトしています:

//return shortUrl;
console.log(shortUrl);

これにより、コンソールに正しい値が表示されます。しかし、それがまだ未定義として表示されるため、shortLink 変数に返されません。ここで簡単なものが欠けていますか?値が shortLink 変数に返されないのはなぜですか? jQuery で動的に作成されたリンクが関数を通過するのはなぜですか?

更新編集:

これを少しだけリセットします。問題は shortUrl 関数内、またはそれに値を渡す方法にあると思います。機能をテストするために、私はこれを行いました:

    function shortenUrl(url) {

        var url = url,
            username = 'username',
            key = 'api key';

        $.ajax({
            url: 'http://api.bit.ly/v3/shorten',
            data: {
                longUrl: url,
                apiKey: key,
                login: username
            },
            dataType: 'jsonp',
            success: function (v) {
                var shortUrl = v.data.url;
                return shortUrl;
                //console.log(shortUrl);
            }
        });
    }

var shorten = shortenUrl('http://google.com');
console.log(shorten);

Console.log(shorten) は undefined を返します。ただし、console.log(shortUrl); のコメントを外すと、return shortUrl; をコメントアウトします。関数内で、bit.ly から正しく短縮された URL が返されます。

console.log(shorten) で正しい短縮 URL が返されないのはなぜですか? 変数が間違って渡されていませんか?

4

2 に答える 2

0

正直なところ、私はあまり経験がありませんがjsonp、ajax呼び出しは約束を返すはずです。関数がそのpromiseを返した場合、呼び出し元では次のようshortenUrlに使用できます。done

    function shortenUrl(url) {

        var url = url,
            username = 'bit.ly username',
            key = 'api Key';

        return $.ajax({
            url: 'http://api.bit.ly/v3/shorten',
            data: {
                longUrl: url,
                apiKey: key,
                login: username
            },
            dataType: 'jsonp'
        });
    }

    function modifyDom(v) {
        var shortUrl = v.data.url,
            link = $('<a href="' + shortenLink '">Shorten Link</a>');
        link.prependTo('element');
    }    

    $( function() {
        var pageLink = $(location).attr('href');
        shortenUrl(pageLink)
            .done( modifyDom },
    }​ );

このコードはテストされていませんが、あなたがそのアイデアを理解してくれることを願っています。

于 2012-10-17T22:26:38.027 に答える
0

shortenUrl次のように、短縮された URL を返すリターン URL が関数に含まれている必要があります。

function shortenUrl(url) {
   var shortUrl = url; // for the sake of simplicity
   return shortUrl;
}

私のヒントが正しかったかどうか知りたいのですが、私たち全員に知らせてください。

更新

$(window).load(function(){
function shortenUrl(url) {

    var url = url,
        username = 'bit.ly username',
        key = 'api Key';

    $.ajax({
        url: 'http://api.bit.ly/v3/shorten',
        data: {
            longUrl: url,
            apiKey: key,
            login: username
        },
        dataType: 'jsonp',
        success: function(v) {
            var shortUrl = v.data.url;
            return shortUrl;
        }
    });
}

function some() {
    var pageLink = $(location).attr('href'),
        shortenLink = shortenUrl(pageLink);

    var link = $('<a href="' + shortenLink + '">Shorten Link</a>');
    link.prependTo('element');
}
});

キーとユーザー名が見つからないため、コードを試すことができませんが、これは機能するはずです。両方を正しいものに置き換えて、次のようにコードを呼び出すようにしてください。

some();

そして、ブラウザのコンソールでエラー/警告を常に監視してください!

于 2012-10-17T21:53:00.600 に答える