Javascript:这个条件有什么问题?
我正在做一个Chrome扩展,我碰到了一堵墙Javascript:这个条件有什么问题?,javascript,ajax,google-chrome-extension,Javascript,Ajax,Google Chrome Extension,我正在做一个Chrome扩展,我碰到了一堵墙 function isInQueue(id) { chrome.extension.sendRequest({getQueueItems: 1}, function(response) { var items = response.items; if (items) { for (var i = 0; i < items.length; i++) {
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; }
});
}
函数isInQueue(id){
sendRequest({getQueueItems:1},函数(响应){
var items=response.items;
若有(项目){
对于(变量i=0;i
请求返回“items”,它是一个对象数组。我试图查看队列外的另一项是否已存在于队列内。例如,外部有一个id等于“198677”的项目。我知道我的队列中已经有一个相同项目的精确副本,具有完全相同的id“198677”,但是,当我测试这两个项目是否相等时(items[I]。id==id)==true,它返回false。我已经检查了两者的类型,它们都是字符串。我尝试过使用==
,但没有成功。我试着给每一个函数加零以将它们转换成整数,这使得函数在实际为true时返回true,然而,当我测试trueif(isInQueue(id)==true)
时,条件返回false
这对我来说是非常困惑和沮丧的。它们都是弦,为什么不起作用
非常感谢您的帮助。问题在于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);
});
}
函数isInQueue(id,回调){
sendRequest({getQueueItems:1},函数(响应){
var结果=假;
var items=response.items;
若有(项目){
对于(变量i=0;i
问题在于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);
});
}
函数isInQueue(id,回调){
sendRequest({getQueueItems:1},函数(响应){
var结果=假;
var items=response.items;
若有(项目){
对于(变量i=0;i
我想出来了:
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;
}
函数isInQueue(id){
var结果=假;
var queue=localStorage[“queue_rss”];
if(队列!=未定义){
var items=JSON.parse(queue).items;
若有(项目){
对于(变量i=0;i
我本来应该这样做的。
谢谢你们我想起来了:
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;
}
函数isInQueue(id){
var结果=假;
var queue=localStorage[“queue_rss”];
if(队列!=未定义){
var items=JSON.parse(queue).items;
若有(项目){
对于(变量i=0;i
我本来应该这样做的。
谢谢你们D实际上,sendRequest
在不等待其回调函数执行的情况下立即返回,而不是“不立即返回”。不等待回调函数执行部分是使回调函数无法返回值的原因。@slebetman:你完全正确。我会更正我的措辞。只是为了澄清:更重要的是,chrome.extension.sendRequest
不可能立即返回,但InInquireue
会立即返回,因为JavaScript是单线程的。我确实将队列作为字符串化JSON存储在localStorage中。我可能应该这样得到“项目”。让我试试。@X Enterprises:如果可以的话,使用缓存几乎总是更好的。实际上,sendRequest
在不等待其回调函数执行的情况下立即返回,而不是“不立即返回”。不等待回调函数执行部分是使回调函数无法返回值的原因。@slebetman:你完全正确。我会更正我的措辞。只是为了澄清:更重要的是,chrome.extension.sendRequest
不可能立即返回,但InInquireue
会立即返回,因为JavaScript是单线程的。我确实将队列作为字符串化JSON存储在localStorage中。我可能应该这样得到“项目”。让我试试。@X Enterprises:如果可以的话,使用缓存几乎总是更好。@X Enterprises:您不需要在这里调用带有结果的回调函数,因为您没有执行任何异步操作。您可以删除回调参数,只需完成返回结果代码>而不是回调(结果)
@X Enterprises:您不需要在这里调用带有结果的回调函数,因为您没有进行任何异步操作