【发布时间】:2017-03-26 20:05:34
【问题描述】:
我有一个调用 JS 函数 (NodeJS) 的代码块。它调用的函数包含一个 Promise 链。下面是调用函数的代码:
'use strict'
const request = require('request')
try {
const data = search('javascript')
console.log('query complete')
console.log(data)
} catch(err) {
console.log(err)
} finally {
console.log('all done')
}
function search(query) {
searchByString(query).then( data => {
console.log('query complete')
//console.log(JSON.stringify(data, null, 2))
return data
}).catch( err => {
console.log('ERROR')
console.log(err)
throw new Error(err.message)
})
}
function searchByString(query) {
return new Promise( (resolve, reject) => {
const url = `https://www.googleapis.com/books/v1/volumes?maxResults=40&fields=items(id,volumeInfo(title))&q=${query}`
request.get(url, (err, res, body) => {
if (err) {
reject(Error('failed to make API call'))
}
const data = JSON.parse(body)
resolve(data)
})
})
}
当我运行代码时,控制台显示query complete,后跟搜索结果。
然后我得到一个错误:TypeError: google.searchByString(...).then(...).error is not a function 这没有意义!为什么会触发此错误?
【问题讨论】:
-
除非你使用一些 Promise 库,否则你需要
.catch()而不是.error()。 -
绝对是
.catch,而且,你所拥有的 try/catch 永远不会工作,因为它在同步函数中,而你的 promise 逻辑是异步的。 -
感谢您发现拼写错误 Madara。为了清楚起见,我将所有代码合并到一个脚本中。现在我得到
query complete但没有数据。我可以看到数据以错误的顺序返回以使 catch 起作用。 -
您的搜索是异步的,但您尝试使用它同步。查看stackoverflow.com/questions/14220321/… 以更好地理解异步概念
标签: javascript node.js error-handling ecmascript-6 es6-promise