白驹过隙,这篇文章距今已有一年以上的历史。技术发展日新月异,文中的观点或代码很可能过时或失效,请自行甄别:)

在用Backbone时发现了一个很奇怪的事情,各种纠结,各种google,最郁闷的是让我遇到了"传说中开发最郁闷的事:发现了一个问题,google后发现有人在stackoverflow上提了一个相同的问题,但是...没有人回答".还好,最后解决了,记录下,方便下后来人.

前端js我是像这样写的:

var Book = Backbone.Model.extend({
    url:'/test.php',
    initialize:function(){
        this.fetch({
            success:function(models,resp){
                console.log('success');
            },
            error:function(){
                console.log('error');
            }
        });
    }
});

var book = new Book;

服务端我简单粗暴这样写的:

<?php
    header('Content-Type:application/json');
    echo "{name:'Scofield',age:1}";
    exit;

结果怪事发生了,终端里面一直都是直接进入了error,而看终端上面ajax回来的数据正常,HTTP状态码也是200,怪了.一番纠结后,在stackoverflow上的一个回答提示了我,于是我在fetch的时候添加了一个complete事件,代码如下:

//省略
this.fetch({
            success:function(models,resp){
                console.log('success');
            },
            error:function(){
                console.log('error');
            },
            complete:function(xhr,status){
                console.log(status);
            }
        });
//省略

运行后发现status的结果为parseerror,好了,再次google了下parserror这个东西,发现时json解析错误导致.好吧,原来是服务端返回的数据有问题.于是修改了下服务端的数据:

<?php
    header('Content-Type:application/json');
    echo json_encode((object)array(
        'name' => 'Scofield',
        'age'  => 1
    ));
    exit;

测试,终端看到直接进入success的流程了.但是我明明在服务端告诉了ajax哥返回的就是json啊,奇了怪了,然后仔细查看了下我两次分别返回回来的值,发现了一个现象,parseerror时返回来的值是这样的:

"{name:'Scofield',age:1}"

而解析成功时返回的值是这样的:

"{name:"Scofield",age:1}"

会不会是单引号的原因呢?于是我便把第一次服务端代码改成了这样:

echo "{name:\"Scofield\",age:1}";

OK,成功了.Google了下才知道原来JSON的格式是用双引号的,如果用单引号会有问题...