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ライブラリを使用していない限り、 '.error()'ではなく '.catch()'が必要です。 –
間違いなく '.catch'だけでなく、あなたが持っているtry/catchは、同期関数内にあり、約束のロジックが非同期であるため動作しません。 – loganfsmyth
マダラの誤植を見つけてくれてありがとう。わかりやすくするために、すべてのコードを1つのスクリプトにまとめました。これで 'query complete'が得られますが、データはありません。私は、データが間違った順序で戻ってくることがわかります。 –