【发布时间】:2018-02-21 00:12:02
【问题描述】:
我编写了这个从 URL 获取文件的函数,并考虑了重定向:
const fetchFile = (url, successCallback, errorCallback) => {
http.get(url).on('response', function(response) {
var body = ''
if((response.statusCode == 301) || (response.statusCode == 302)) {
console.log('Redirection for ' + url + ' to ' + response.headers.location + ' caught...')
fetchFile(response.headers.location, successCallback, errorCallback)
return
}
response.on('data', function(chunk) {
body += chunk
})
response.on('end', function() {
console.log('Completed!')
successCallback(body)
})
})
}
这段代码似乎工作正常,现在我正在尝试重写它以使用没有任何外部模块的承诺,但我没有取得太大进展。我想出了这段代码:
const fetchFileProm = function(url) {
console.log('In fetchFileProm()');
return new Promise((resolve, reject) => {
console.log('In Promise function body')
var req = http.get(url, (response) => {
console.log('In Response handler func body');
var body = ''
if((response.statusCode == 301) || (response.statusCode == 302)) {
console.log('Redirection for ' + url + ' to ' + response.headers.location + ' caught...')
return fetchFileProm(response.headers.location)
}
response.on('data', (fragment) => { body += fragment })
response.on('end', () => resolve(body) )
})
req.on('error', function(err) {
reject(err)
})
})
}
当我运行它时,我收到了In Promise function body 消息,但仅此而已。我在这里做错了什么?
【问题讨论】:
-
return fetchFileProm(response.headers.location)必须是fetchFileProm(response.headers.location).then(resolve, reject) -
Node 现在完全支持async/await,你应该尝试一下而不是 Promises。只是说
-
@Btz 看我贴的答案,比较透彻(你对问题中代码所做的修改不够)
-
@JeremyThille 为了使用 async-await,
http.get()操作无论如何都必须“承诺”
标签: javascript node.js http promise es6-promise