我正在使用node-fetch向亚马逊存储桶发出HEAD请求以检查文件的状态,但是我试图设置模块P-Queue来控制并发性。
我有一个数组resources
,其中包含我的所有数据,包括要在该存储桶中检查的文件路径。然后像这样映射数组:
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
});
});
}
但是,每当我运行此脚本时,我会遇到Failed to add resource to queue: TypeError: fn is not a function
错误,次数是我拥有资源的次数。
我检查了validateImage返回的内容是一个Promise,并且我还尝试从p队列github重写示例以使用fetch(怀疑是原因):
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');
});
这确实有效,所以我不确定现在在哪里找?
答案 0 :(得分:2)
queue.add
需要一个函数,但是您传递了Promise。
调用queue.add(validateImage(resource))
时,引擎首先评估validateImage(resource)
,并返回一个Promise。然后,它计算queue.add(<returned promise>)
。
只需将调用更改为箭头功能:queue.add(() => validateImage(resource))