我正在尝试下载一堆文件,存储一些关于每个文件的数据,然后使用该数据进一步处理它们。我稍后使用Promise.map(queue,(x)=>get_image(...x),{concurrency: 1}).all().then( )
将所有这些一起处理。但在我的.then()
次来电之后,没有其他.then()
来电似乎有效:'download processed'
永远不会被打印出来,即使'processing downloaded image'
是。var get_image = (page_string, row, col) => {
var url = get_url(page_string,row,col)
var path = 'results/'+page_string+'/'+page_string.match(/f\d\d\d\w/)[0]+'_r'+pad_int(row)+'_c'+pad_int(col)+'.jpg'
y = download(url,path)
.then(process_downloaded(path))
.then((x) => {console.log('download processed'); return x})
return y
}
var download = (url, dest) => {
console.log('attempting download')
console.log(url)
var y = new Promise((res,err) => {
request(url).pipe(fs.createWriteStream(dest))
.on('close', () => res)
.on('error', (e) => {fs.unlink(dest); err(e)})
})
return y
}
var process_downloaded = (dest) => {
var p = dest.match(/_f\d\d\d\w/)[0]
console.log(dest,'processing downloaded image')
var r = parseInt(dest.match(/r\d+/)[0].slice(1))
var c = parseInt(dest.match(/c\d+/)[0].slice(1))
var record = {id: p, r: r, c: c}
if(fs.readFileSync(dest).toString('utf8').slice(0, 5) === 'http:'){fs.unlink(dest); return {id: p, r: 0, c: 0}} // 404 error
return record
}
。有人能告诉我我错过了什么吗?
jQuery(function() {
jQuery(".collection").sortable({});
jQuery('li', jQuery('.collection')).draggable({
'connectToSortable': '.collection',
'cancel': 'a.ui-icon',
'revert': 'invalid',
'containment': 'document',
'cursor': 'move'
});
});
答案 0 :(得分:0)
此代码至少存在两个问题:
.on('close', () => res)
不会调用res()
函数;它必须是.on('close', () => res())
或.on('close', res)
。
此外,在.then(process_downloaded(path))
中:process_downloaded(path)
是一个对象,但.then()
需要一个函数作为参数。 .then(() => process_downloaded(path))
正常运作。
为防止将来出现此类错误,Promise.config({ warnings: true, longStackTraces: true, cancellation: true, monitoring: true })
可以提供帮助;启用时,上述错误会产生警告,但第一个错误则不会。 (http://bluebirdjs.com/docs/api/promise.config.html)
此外,fs.unlink(dest)
在代码中使用了两次,但并不意味着在没有回调的情况下调用,并产生警告。如果由于某种原因需要很长时间才能完成,那么当图像之后合成时,文件可能仍然存在。我用fs.unlinkSync(dest)
代替了。这是一个性能成本,但我不打算用它来获得高性能。
通过这些更改,代码可以按预期工作。
var get_image = (page_string, row, col) => {
var url = get_url(page_string,row,col)
var path = 'results/'+page_string+'/'+page_string.match(/f\d\d\d\w/)[0]+'_r'+pad_int(row)+'_c'+pad_int(col)+'.jpg'
y = download(url,path)
.then(() => process_downloaded(path))
.then((x) => {console.log('download processed',x); return x})
return y
}
var download = (url, dest) => {
console.log('attempting download')
console.log(url)
var y = new Promise((res,err) => {
request(url).pipe(fs.createWriteStream(dest))
.on('close', res)
.on('error', (e) => {fs.unlinkSync(dest); err(e)})
})
return y
}
var process_downloaded = (dest) => {
var p = dest.match(/arundel_ms_263_f\d\d\d\w/)[0]
console.log(dest,'processing downloaded image')
var r = parseInt(dest.match(/r\d+/)[0].slice(1))
var c = parseInt(dest.match(/c\d+/)[0].slice(1))
var record = {id: p, r: r, c: c}
if(fs.readFileSync(dest).toString('utf8').slice(0, 5) === 'http:'){fs.unlinkSync(dest); return {id: p, r: 0, c: 0}} // 404 error
return record
}