8

設定:

各行がクリック可能なDatatableがあります。行がクリックされると、いくつかのデータを返すajax呼び出しが行われます。返されるデータの量によっては、ajax呼び出しに少し時間がかかる場合があります。すべて正常に動作しています。

問題:

この問題は、行が次々にすばやくクリックされたときに発生します。つまり、前のajax呼び出しが戻る前に、行がクリックされた場合(つまり、新しいajax呼び出しが行われた場合)、エラーが発生します。

Uncaught TypeError: Property 'callback' of object [object Window] is not a function 

(ajax呼び出しはJSONPデータを返します)

どういうわけかajax呼び出しが混ざり合っているように見えます(?)が、私にはわかりません。なぜこれが起こるのか誰か教えてもらえますか?

問題を明確にするためにさらに情報が必要な場合はお知らせください。

ありがとう

編集1:

ここにいくつかのajaxコードがあります:

            $.ajax({
                type: "GET",
                url: 'http://' + myserver + ':8080/someurl/' + my_param,
                contentType: "application/json",
                dataType: "jsonp",
                jsonpCallback: 'callback',
                success: function(data) {
                // Inside here, I am doing some Datatables stuff.
                var myTable = $('#my_table').dataTable( {
                        "bJQueryUI" : true,
                        "bSort" : false,
                        "bFilter" : false,
                        "bPaginate": true,
                        "bProcessing": true,
                        "bScrollCollapse": true,
                        "bInfo": false,
                        "bDestroy": true,
                        "aaData": samples,
                        "sEmptyTable": "No sample listings avaiable",
                        "iDisplayLength": number,
                        "bLengthChange": false,
                        "bAutoWidth": false,
                        .
                        .
                        .
                    }

編集2:

callbackこれがその名前を割り当てているクラスです。デフォルトのコールバックがnullの場合、デフォルト値「callback」が割り当てられます。しかし、どういうわけか、デフォルトのコールバックは常にnullであるため、常に「コールバック」が割り当てられているように見えます。

public class MappingJacksonJsonpConverter extends MappingJacksonHttpMessageConverter {

    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {

        JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType());
        JsonGenerator jsonGenerator = this.getObjectMapper()
                .getJsonFactory()
                .createJsonGenerator(outputMessage.getBody(), encoding);
        try {
            String jsonPadding = "callback";
            if (object instanceof JsonObject) {
                String jsonCallback = ((JsonObject) object).getJsonCallback();
                if (jsonCallback != null) {
                    jsonPadding = jsonCallback;
                }
            }
            jsonGenerator.writeRaw(jsonPadding);
            jsonGenerator.writeRaw("(");
            this.getObjectMapper().writeValue(jsonGenerator, object);
            jsonGenerator.writeRaw(")");
            jsonGenerator.flush();
        } catch (JsonProcessingException ex) {
            throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex);
        }
    }
}

そして、上記のクラスは次のように参照さmvc-servlet.xmlれています:

    <mvc:message-converters>
        <bean
            class="citygrid.feedmanager.web.converter.MappingJacksonJsonpConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/x-javascript</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
4

2 に答える 2

7

問題は、jQueryがJSONPを使用したコールバックとどのように連携するかにあります。アイデアは次のとおりです。

  1. JSONPが起動されます。
  2. コールバックが設定されています。
  3. JSONPは戻ります。
  4. コールバックが発生します。
  5. コールバックは削除されます。

カスタムを定義しない場合、すべてが正常に機能するようになりjsonpCallbackました(デフォルトでは、jQueryは各JSONPリクエストに一意のコールバックを割り当てます)。では、2つのJSONPリクエストを同時に実行するとどうなりますか?

  1. JSONP1が起動されます。
  2. 名前付きのコールバックcallbackが設定されます。
  3. JSONP2が起動されます。
  4. コールバックcallbackはJSONP2によってオーバーライドされます。
  5. JSONP1は戻ります。
  6. callbackJSONP1に対してコールバックが発生します。
  7. JSONP1はcallback;を削除します。
  8. JSONP2は戻ります。
  9. JSONP2は起動を試みcallbackますが、それはすでに削除されています。
  10. TypeErrorがスローされます。

簡単な解決策は、オプションを上書きしないことjsonpCallbackです。

于 2012-07-16T07:38:31.347 に答える
4

Alex Ballが提案したように、AJAXリクエストをキューに入れて、1つずつ実行する必要があります。ここにstackoverflowの投稿で示されているように、これは非常に単純です(はい、JSON-Pでも機能します)。

2つ目は、という名前のグローバル関数Property 'callback' of object [object Window] is not a functionがないという理由だけでエラーメッセージが表示されることです。次のように定義してください:callback

window.callback= function(responseText) {
    //alert(responseText);
};

お役に立てれば。

于 2012-07-16T07:34:48.230 に答える