Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:这个条件有什么问题?_Javascript_Ajax_Google Chrome Extension - Fatal编程技术网

Javascript:这个条件有什么问题?

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++) {

我正在做一个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++) {
                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,然而,当我测试true
if(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:您不需要在这里调用带有结果的回调函数,因为您没有进行任何异步操作