0

オブジェクト指向のjQueryを少し試していますが、うまくいきません。2 つのメソッドを作成しました。

  • DoConnect-> URL が使用可能かどうかを確認するための AJAX 要求。 callback(true)接続に成功したcallback(false)場合、失敗した場合。
  • Connect->呼び出す必要がある場所から呼び出されます。

何が機能しますか?

DoConnectホストへの接続を試み、callback. これはうまくいきます。 Connectこれを読んcallbackでも、うまくいきます。(のブール値alertを返すように追加して、これをテストしました)callback

何がありませんか?

ええと、Connect最初に呼び出された場所に値をcallback持っている必要があります。return

私がこれまでに持っているコード

クラスとConnectメソッド

var Class = 
{
    Connect : function(host, apikey)
    {
        var returnVal;

        DoConnect(host, apikey, function(res)
        {
            if (res)
            {
                // alert('TRUE');
                returnVal = true;
            }
            else
            {
                // alert('FALSE');
                returnVal = false;
            }
        });

        return returnVal;
    }
}

DoConnect方法_

var DoConnect = function(host, apikey, callback)
{
    $.ajax({
        type: 'GET',
        url: host + "/api?do=ping&" + apikey,
        dataType: 'jsonp',
        success: function(e)
        {
            if (e.status != undefined)
            {
                callback(false);
            }
            else
            {
                callback(true);
            }
        }
    });
}

私はこのように呼んでいます。

var IsConnected = Class.Connect(host, apikey);
alert(IsConnected) // Returns undefined.

Chrome のデバッグ コンソールはエラーを返しません。ここで何が間違っていますか?

4

2 に答える 2

1

returnVal答えがそこにある前にあなたのリターン。戻り値は非同期です。チェーン全体で非同期のままにする必要があります。

Connect次のように、関数にもコールバックを追加する必要があります。

Connect : function(host, apikey, callback)

次に、DoConnect 関数のコールバック内でコールバックを呼び出します。

        if (res)
        {
            // alert('TRUE');
            return callback(true);
        }
        else
        {
            // alert('FALSE');
            return callback(false);
        }    

次のように関数を呼び出すことができます。

Class.Connect(host, apikey, function(returnValue) {
    alert(returnValue);
});
于 2013-03-02T08:50:43.137 に答える
0

値を返す前に、ajax呼び出しが終了するのを待つ必要があります。これは、asyncオプションをfalseに設定することで実現できます…まあ、できません。

ドキュメントから:

クロスドメインリクエストとdataType:「jsonp」リクエストは同期操作をサポートしていません。

さて、古き良き時代のポーリングループを実行する必要があります。

... // after $.ajax call
while(typeof(returnVal) === "undefined");

return returnVal;

これは、jquery呼び出し(「AJAX」の最初の「A」)の非同期性を明確に打ち負かしますが、それが必要な機能である場合は、そこに到達します。

于 2013-03-02T09:08:33.083 に答える