2013-01-10 76 views
-1

我有一個對象獲取對象值

var actions = { 
    'photos': function() 
    { 
     var self = this; // self = actions 

     $.get('./data.php?get=photos', function(data) 
     { 
      self.result = data; 
     }); 
    }, 
    'videos': function() 
    { 
     var self = this; 

     $.get('./data.php?get=videos', function(data) 
     { 
      self.result = data; 
     }); 
    } 
}; 

每個函數創建於actions多了一個項目叫result

然後,而不是switch我用這個(工作好):

if (actions[action]) 
{ 
    actions[action](); // call a function 
    console.log(actions); 
    console.log(actions.result); 
} 

action是值爲photosvideos的變量。

console.log(actions)給出了這樣的:

Object 
message: function() 
messages: function() 
profile: function() 
profile-edit: function() 
result: "<div>...</div>" 
__proto__: Object 

所以我認爲這是resultactions與價值"<div>...</div>"

console.log(actions.result)回報undefined

爲什麼?

我知道所有這些代碼可能會重新編寫,但我想了解undefined的原因。

+3

你的問題是相當不清楚。 'action'是對'actions.photos' /'actions.videos'(正如@dystroy認爲的那樣)或字符串'「photos」'/'「videos」'的引用嗎? 'items [action]();'中的'items'是什麼?如果'action'是對'actions.photos'的引用,那麼爲什麼要使用函數引用來索引另一個對象呢? –

+1

'items [action]()'是一個錯字,應該是'actions [action]()'而不是。固定。 –

+0

這樣做更有意義。 :-)所以'動作'是一個字符串('「照片」或「視頻」),對吧? –

回答

3

因爲我們正在處理異步請求,所以我們使用「回調」。

當異步請求準備好時,會調用回調。您的請求會得到回覆,並且您將該回復與回調一起發送。回調處理響應。

var actions = { 
    'photos': function(callback) 
    { 
     $.get('./data.php?get=photos', callback); 
    }, 
    'videos': function(callback) 
    { 
     $.get('./data.php?get=videos', callback); 
    } 
}; 

var action = 'photos'; 

actions[action](function(data) { 
    console.log(data); 
}); 

既然你ensist在保持價值觀,我會用這樣的結構:

var actions = { 
    'photos': function() 
    { 
     $.get('./data.php?get=photos', function() { 
      this.__callback('photos', data); 
     }); 
    }, 

    'videos': function() 
    { 
     $.get('./data.php?get=videos', function() { 
      this.__callback('videos', data); 
     }); 
    }, 

    '__callback': function(action, data) { 
     this.results[action].push(data); 
    }, 

    'results': { 
     'photos': [], 
     'videos': [] 
    } 
}; 

var action = 'photos'; 

actions[action](); 

// use a timeout because we are dealing with async requests 
setTimeout(function() { 
    console.log(actions.results); // shows all results 
    console.log(actions.results.photos); // shows all photos results 
    console.log(actions.results.videos); // shows all videos results 
}, 3000); 

gaaah什麼可怕的一段代碼...

+0

我想保留'$ .get'的當前結構,因爲在每個'actions'項目中可以在'self.result = data'後面使用額外的代碼 –

+2

@JohnRezza然後在您的匿名成功回調的結束:'$ .get(「...」,function(data){self.result = data; callback();})' – apsillers