我有一段調用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將永遠不會工作,因爲它在同步函數內,並且您的承諾邏輯是異步的。 – loganfsmyth
感謝您發現錯字Madara。爲了清晰起見,我已將所有代碼整合到一個腳本中。現在我得到'query complete',但沒有數據。我可以看到數據以錯誤的順序返回以使捕獲工作。 –