2

私はSenchaTouchで少し遊び始めました。

そこで、例の1つに基づいて、実際にどのように動作するかを確認するために、非常に単純なアプリケーションを作成しました。

基本的に、Last.FMWebサービスを実行してユーザーの場所の近くで音楽イベントを取得するJSONリクエストを作成します。

JSONコードは次のとおりです。

var makeJSONPRequest = function() {
        Ext.util.JSONP.request({
        url: 'http://ws.audioscrobbler.com/2.0/',
            params: {
                method: 'geo.getEvents',
                location: 'São+Paulo+-+SP',
                format: 'json',
                callback: 'callback',
                api_key: 'b25b959554ed76058ac220b7b2e0a026'
            },
            callback: function(result) {
                var events = result.data.events;
                if (events) {
                    var html = tpl.applyTemplate(events);
                    Ext.getCmp('content').update(html);                        
                }
                else {
                    alert('There was an error retrieving the events.');
                }
                Ext.getCmp('status').setTitle('Events in Sao Paulo, SP');
            }
        })
    };

しかし、実行しようとするたびに、次の例外が発生します。

Uncaught SyntaxError:予期しないトークン:

誰か手がかりがありますか?

4

1 に答える 1

2

いくつかのこと。まず第一に、ブラウザのjavascriptエンジンが、間違った場所に配置され"Uncaught SyntaxError: Unexpected token :"たコロンについて不平を言っていることを意味します。":"

問題は、返されたJSONにある可能性があります。サーバーが返すものはすべてeval("{JSON HTTP RESULT}")javascriptの関数を介して実行されるため、最も可能性の高いのは、問題がどこかにあることです。

私はあなたのコードを小さな煎茶テストハーネスに置きました、そしてそれに関するいくつかの問題を見つけました。

最初に:私のブラウザは「squigglyã」にあまり満足してlocation: 'São+Paulo+-+SP',いなかったので、これを変更しlocation: 'Sao+Paulo,+Brazil',て機能し、audioscribblerAPIから正しい結果を返す必要がありました。

2番目:リクエストパラメータに行を追加したことに気付きましたcallback: 'callback',。これにより、HTTP結果の性質が変更され、次のようにJSONが返されます。

callback({ // a function call "callback(" gets added here
   "events":{
      "event":[
         {
            "id":"1713341",
            "title":"Skank",
            "artists":{
               "artist":"Skank",
               "headliner":"Skank"
            },
         // blah blah more stuff
      "@attr":{
         "location":"Sao Paulo, Brazil",
         "page":"1",
         "totalpages":"1",
         "total":"2"
      }
   }
}) // the object gets wrapped with extra parenthesis here

そうする代わりに、 http://dev.sencha.com/deploy/touch/examples/ajax/index.jscallbackKey: 'callback'の例に付属しているを使用する必要があると思います。

たとえば、次のようなものです。

   Ext.util.JSONP.request({
        url: 'http://ws.audioscrobbler.com/2.0/',
            params: {
                method: 'geo.getEvents',
                location: 'Sao+Paulo,+Brazil',
                format: 'json',
                api_key: 'b25b959554ed76058ac220b7b2e0a026'
            },
            callbackKey: 'callback',
            callback: function(result) {
                 // Output result to console (Firebug/Chrome/Safari)
                 console.log(result);
                 // Handle error logic
                 if (result.error) {
                    alert(result.error)
                    return;
                 }
                 // Continue your code
                var events = result.data.events;
                // ...
            }
        });

それは私にとってはうまくいったので、うまくいけばあなたにもうまくいくでしょう。チェリオ。

于 2010-11-10T21:41:05.293 に答える