1

AJAX呼び出しを介してJavascriptオブジェクトが作成された後、アクションをトリガーしようとしています。私のオブジェクトは次のようになります。

function API(uid,accessToken){      
        $.ajax("path/to/file", {
            type: "POST",
            data: { user: uid, auth: accessToken },
            dataType: "json",
            success: function(jsonData) {
                arrayname = jsonData[values]
            }
        });
}

JQueryの$.when関数を使用して、オブジェクトのセットアップが完了した後(つまり、配列にajax応答が入力された後)にコールバックを実行しようとしました。これは次のようになります。

        $.when( API = new API(uid, accessToken) ).then(function() {
                ...success function...
        });

...しかし、$.when関数はarrayname値がまだ定義されていない状態でトリガーします。関数の観点からは、オブジェクト値がまだ設定されていなくても、遅延オブジェクトは解決されます。それ以来、ajax呼び出し全体の完了と変数の設定に基づいて、APIオブジェクトを延期する方法をいくつか試しましたが、これを行うための最善の方法に少し固執しています。

どんなポインタでも大歓迎です!ありがとう。

4

3 に答える 3

0

次のように、オブジェクトを作成するときにコールバック関数を渡すことができます。

function API(uid,accessToken, callback){      
        $.ajax("path/to/file", {
            type: "POST",
            data: { user: uid, auth: accessToken },
            dataType: "json",
            success: function(jsonData) {
                arrayname = jsonData[values]
                callback(jsonData[values])
            }
        });
}

次に、そのようにオブジェクトをインスタンス化します

var api = new API(uid, accessToken, function(array) {
    // success function
});
于 2012-07-29T01:25:53.133 に答える
0

問題が「then」コールバックの後に実行されている「success」コールバックが原因である場合は、successコールバックをthenコールバックに変換してみることもできます。私はJQueryを使用していませんが、次のようになります。

function API(uid,accessToken){      
    return $.ajax("path/to/file", {
        type: "POST",
        data: { user: uid, auth: accessToken },
        dataType: "json",
    }).then(function(jsondata){
        arrayname = jsondata[values]
    });
}

$.when( API = new API(uid, accessToken) ).then(function() {
    // ...
});
于 2012-07-29T01:30:30.923 に答える
0

使用する理由$.whenは、複数のプロミス、非同期タスクなどのコールバックを関連付ける場合です。jQuery 1.5 以降、すべての呼び出し$.ajaxとすべてのラッパー ($.getおよび) はすべてpromises を$.post返します。したがって、必要でない限り、この呼び出しをステートメントでラップする必要はありません。$.when$.when(ajaxCall1, ajaxCall2)

サーバーからの結果をフィルタリングしたいので、promise のpipeメソッドを使用する必要があります。

function API(uid, accessToken)
  return $.post(
    type: 'POST'
    ,data: { user: uid, auth: accessToken }
    ,dataType: 'json'
  )
    .pipe(function(json) {
      return json[values];
    })
  ;
}

これにより、コードを好きなように書くことができます。

API(uid, token)
  .then(
    // success state (same as promise.done)
    function(arrayname /* named from your sample script*/) {
      alert('success! ' + arrayname);
    }
    // error state (same as promise.fail)
    ,function(jqXHR, status, error) {
      console.warn('oh noes!', error);
    }
  )
  .done(function() { /* done #2 */ })
  .fail(function() { /* fail #2 */ })
;

注:promise.pipe()また、エラー コールバックをフィルタリング (渡されるデータを変更) することもできます。

于 2013-01-29T02:32:30.137 に答える