2010-12-19 117 views
1

我正在使用Chrome擴展程序,我碰到了一堵牆。Javascript:這個條件有什麼問題?

function isInQueue(id) { 
    chrome.extension.sendRequest({getQueueItems: 1}, function(response) { 
     var items = response.items; 
     if (items) { 
      for (var i = 0; i < items.length; i++) { 
       if ((items[i].id == id) == true) return true; 
      } 
      return false; 
     } else { return false; } 
    }); 
} 

該請求返回'items',它是一個對象數組。我試圖看看以外的其他項目的隊列已經存在裏面的這個隊列。例如,外部有一個id等於'198677'的項目。我知道我已經有一個完全相同的物品在我的隊列中,具有完全相同的編號'198677',但是,當我測試兩個等號爲(items[i].id == id) == true時,它返回false。我檢查了兩者的類型,它們都是字符串。我嘗試過使用===,但這一行不通。我嘗試給它們中的每一個都加零以將它們變成整數,並且當它實際上是真的時使函數返回真,但是,當我測試真正的if (isInQueue(id) == true)時,條件返回了假。

這對我來說都非常混亂和令人沮喪。它們都是字符串,它爲什麼不起作用?

幫助非常感謝。

回答

1

我想通了:

function isInQueue(id) { 
    var result = false; 
    var queue = localStorage["queue_rss"]; 
    if (queue != undefined) { 
     var items = JSON.parse(queue).items; 
     if (items) { 
      for (var i = 0; i < items.length; i++) { 
       if ((items[i].id == id) == true) { 
        result = true; 
        break; 
       } 
      } 
     } 
    } 
    return result; 
} 

我應該做它擺在首位的方式。 謝謝你們。 :D

+2

@X企業:你不需要在這裏調用一個回調函數,因爲你沒有做任何異步的事情。您可以刪除回調參數,只需使用'return result;'而不是'callback(result);'完成 – sje397 2010-12-19 23:43:55

6

問題是chrome.extension.sendRequest是異步的 - 它立即返回,但您提供給它的回調函數只有在請求完成後纔會被調用。

處理這種事情的常用方法是將回調傳遞給您的isInQueue方法;當異步操作結果結束時調用回調函數。

function isInQueue(id, callback) { 
    chrome.extension.sendRequest({getQueueItems: 1}, function(response) { 
     var result = false; 
     var items = response.items; 
     if (items) { 
      for (var i = 0; i < items.length; i++) { 
       if ((items[i].id == id) == true) { 
        result = true; 
        break; 
       } 
      } 
     } 
     callback(result); 
    }); 
} 
+2

實際上,'sendRequest' **立即返回**而不必等待它的回調函數執行,而不是'不立即返回'。不等待回調函數執行部分是因爲回調函數無法返回值。 – slebetman 2010-12-19 23:16:20

+0

@slebetman:你絕對正確。我會糾正我的措辭。 – sje397 2010-12-19 23:18:34

+0

只是澄清:甚至更多,'chrome.extension.sendRequest'不會立即返回,而是'inInQueue',因爲JavaScript是單線程的。 – 2010-12-19 23:25:40