私はGoogle APIを使用するモジュールを作成していますが、約束事に基づいてコールバックのすべてをラッピングしています。これは、問題領域のコードコールバック内でプロミスリジェクトが機能しない
file1.js
var File2 = require('file2')
var api = new File2()
api.auth().then(auth => {
api.search('example').then(res => {
...do some stuff...
})
}).catch(err => {
console.log('1') //Not being run
throw err
})
file2.js
class File2(){
auth() {
...works fine and resolves...
}
search() {
return new Promise((resolve, reject) => {
googleapi.somemethod(options, (err, res) => {
if(err) {
console.log('2') // DOES run
reject(new Error(err))
}
resolve(res.field) //Program crashes here because reject didn't actually reject
})
})
}
auth
への呼び出しがうまく働いている
が、search
への呼び出しである(より具体的にはgoogleapi.somemethod
)が失敗し、err
が定義されています。私は間違いを確認し、console.log('2')
が実行されますが、console.log('1')
がcatch
で実行されないと、エラーはスローされず、res
が定義されていないため、プログラムがクラッシュしてresolve(res)
になります。私の代わりにcatch
を使用してのthen
に2番目の引数としてエラーキャッチャーを入れて試してみたが、それはまだ私はあなたが約束を返すべきノードV6.2.1
にあなたのコードを短縮することができますにアップデートしてください?また、 'else'があってはなりませんか?それは 'resolve'のように常に関係なく呼び出されるようです... – elclanrs
私は約束を返さないのですか? >返信解決() または >返品拒否() また、他の人は正しいかもしれません。私は何かを返すコールバックを処理する一般的なパターンに従っていますが、これは約束のためにはうまくいかないかもしれません。私はいつもそれを私の頭の中に持っていましたが、リターンのような振る舞いを「解決」し、「拒絶」することもありますが、それは私の約束を知る上での穴にすぎません。 – Weston
私の答えをチェックしてください。また、 'else'部分については気にしないでください。 – elclanrs