Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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 具有P-Queue节点模块的排队承诺_Javascript_Node.js - Fatal编程技术网

Javascript 具有P-Queue节点模块的排队承诺

Javascript 具有P-Queue节点模块的排队承诺,javascript,node.js,Javascript,Node.js,我正在使用node fetch向Amazon bucket发出HEAD请求,以检查文件的状态,但我正在尝试设置模块,以便控制并发性 我有一个数组,resources,它包含我的所有数据,包括要在该bucket中检查的文件路径。然后像这样映射数组: resources.map((resource) => { queue .add(validateImage(resource)) .catch((err) => console.error(`Fai

我正在使用node fetch向Amazon bucket发出HEAD请求,以检查文件的状态,但我正在尝试设置模块,以便控制并发性

我有一个数组,
resources
,它包含我的所有数据,包括要在该bucket中检查的文件路径。然后像这样映射数组:

resources.map((resource) => {
    queue
        .add(validateImage(resource))
        .catch((err) => console.error(`Failed to add resource to queue: ${err}`));
});
这就是我的
validateImage
函数的样子:

const validateImage = (resource) => {
    const path = `https://${bucketUrl}/${env}/${resource.path}`;
    verbose && console.log(`Fetching resource: ${path}`);
    return fetch(
        path,
        {
            method: 'HEAD',
            timeout
        }
    )
    .then(res => {
        validatedResources.push({
            ...resource,
            statusCode: res.status
        });
    })
    .catch(err => {
        validatedResources.push({
            ...resource,
            error: err.type
        });
    });
}
但是,每当我运行这个脚本时,我都会得到一个错误:未能将资源添加到队列:TypeError:fn的次数与我拥有的资源的次数不同

我已经检查了validateImage返回的内容是否是一个承诺,并且我还尝试从p-queue github重写该示例以使用fetch(怀疑这是原因):


这确实有效,所以我真的不知道该去哪里查看了?

队列。add
需要一个函数,但您正在传递一个承诺

调用
queue.add(validateImage(resource))
时,引擎首先计算
validateImage(resource)
,这将返回一个承诺。然后计算
queue.add()


只需将调用更改为箭头函数:
queue.add(()=>validateImage(resource))
queue.add
需要一个函数,但您正在传递一个承诺

调用
queue.add(validateImage(resource))
时,引擎首先计算
validateImage(resource)
,这将返回一个承诺。然后计算
queue.add()


只需将调用更改为箭头函数:
queue.add(()=>validateImage(resource))

噢,哇,它一直盯着我的脸。我甚至没有意识到我在下面的例子中传递了一个箭头函数。谢谢哇,它一直盯着我的脸。我甚至没有意识到我在下面的例子中传递了一个箭头函数。谢谢
const PQueue = require('p-queue');
const fetch = require('node-fetch');

const queue = new PQueue({concurrency: 1});

queue.add(() => fetch(
    'http://sindresorhus.com'),
    { method: 'HEAD'}
).then(() => {
    console.log('Done: sindresorhus.com');
});

queue.add(() => fetch('http://ava.li')).then(() => {
    console.log('Done: ava.li');
});