2011-12-11 8 views
0

新しいオブジェクトをJSONとしてポストする長いポーリング操作がありますが、オブジェクトを返す更新を取得しているときに無効なJavaScriptオブジェクトがあるようです有効なJSONまたはJavaScriptオブジェクトを解析する

{'body': 'hello world', 'html': '\n<div class="message" id="md1f1cdab-3c3a-4dfe-b268-834aa9981dec"><b>burakdede: </b>hello world</div>\n', 'from': 'burakdede', 'id': 'd1f1cdab-3c3a-4dfe-b268-834aa9981dec'} 

応答が出てくる前に、私はJavaScriptのオブジェクトにそれを回すためにeval("(" + response + ")")を使用しています:ここで私は更新しましたconsole.logあるjQueryで解析し、それが有効なJavaScriptオブジェクトではありませんので、私は中に到達することはできません。新しいメッセージの投稿と更新の取得には、showメッセージが使用されます。新しい投稿でうまく動作しますが、レスポンスが出てきたらエラーになります。

var updater = { 
    errorSleepTime: 500, 

    poll: function() { 
     var args = {"_xsrf": getCookie("_xsrf")}; 
     args.listing_id = $(".action").attr("id"); 

     $.ajax({url: "https://stackoverflow.com/a/message/updates", type: "POST", dataType: "text", 
       data: $.param(args), success: updater.onSuccess, 
       error: updater.onError}); 
    }, 

    onSuccess: function(response) { 
     try { 
      updater.newMessages(eval("(" + response + ")")); 
     } catch (e) { 
      updater.onError(); 
      return; 
     } 
     updater.errorSleepTime = 500; 
     window.setTimeout(updater.poll, 0); 
    }, 

    onError: function(response) { 
     updater.errorSleepTime *= 2; 
     console.log("Poll error; sleeping for", updater.errorSleepTime, "ms"); 
     window.setTimeout(updater.poll, updater.errorSleepTime); 
    }, 

    newMessages: function(response) { 
     if (!response.messages) return; 
     var messages = response.messages; 
     //console.log(messages.length, "new messages, message is :", messages); 
     updater.showMessage(messages); 
    }, 

    showMessage: function(message) { 
     var existing = $("#m" + message.id); 
     if (existing.length > 0)return; 
     var node = $(message.html); 
     node.hide(); 
     $("#inbox").append(node); 
     node.slideDown(); 
    }, 
}; 

function newMessage(form) { 
    var message = form.formToDict(); 
    var disabled = form.find("input[type=submit]"); 
    disabled.disable(); 

    $.postJSON("https://stackoverflow.com/a/message/new", message, function(response) { 
     updater.showMessage(response); 
     if (message.id) { 
      form.parent().remove(); 
     } else { 
      form.find("input[type=text]").val("").select(); 
      disabled.enable(); 
     } 
    }); 
} 

ではなく、クライアント側で固定し、私は、サーバー側のコードを固定し、それが今取り組んでいます。問題は、適切なJSONを生成できないということでした。

+0

どのような種類のエラーがありますか? – FK82

答えて

0

有効にするには、JSONオブジェクトのプロパティを二重引用符で囲む必要があります。 の定義をhttp://json.orgに見てください。

+0

はい、それは問題を処理する方法のように思えますか? –

+0

JSONを生成していますか? '{name: 'saeed'}'や '{age:23}'などのようなものを作成するのではなく、{{"name": "saeed"、 "age": "23"} ' 。つまり、すべてのプロパティ名とすべての値を二重引用符で囲みます。これが最も安全な方法です。 –

+0

ここは更新のためのPython側のコードです。ちょうどよいはずの辞書オブジェクトを返します。self.finish(dict(messages=str(messages.body)))

1

「text」の代わりにdataType = 'json'を指定します。 jQueryは無効な応答を処理します。

+0

あなたはポーリング関数を意味する両方のajaxクエリはdataType = textですか? –

+0

なぜ私は 'dataType:" json "'を使用しないと、レスポンスはオブジェクトなので、response.body、response.htmlを直接使うことができます。 jQueryは無効な応答を処理します。 – jcisio

関連する問題