2016-06-14 12 views
0

私は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

+0

にあなたのコードを短縮することができますにアップデートしてください?また、 'else'があってはなりませんか?それは 'resolve'のように常に関係なく呼び出されるようです... – elclanrs

+0

私は約束を返さないのですか? >返信解決() または >返品拒否() また、他の人は正しいかもしれません。私は何かを返すコールバックを処理する一般的なパターンに従っていますが、これは約束のためにはうまくいかないかもしれません。私はいつもそれを私の頭の中に持っていましたが、リターンのような振る舞いを「解決」し、「拒絶」することもありますが、それは私の約束を知る上での穴にすぎません。 – Weston

+0

私の答えをチェックしてください。また、 'else'部分については気にしないでください。 – elclanrs

答えて

3

を実行している

api.search('example').then(res => { 
    ...do some stuff... 
}, err => { 
    console.log('2') // Still doesn't run 
    throw err 
}) 

を動作しません。 :

:あなたは search内部 authを必要としない場合

var File2 = require('file2') 
var api = new File2() 
api.auth().then(auth => { 
    return api.search('example').then(res => { // return the promise 
    return ... 
    }) 
}).catch(err => { 
    console.log('1') // Not being run 
    throw err 
}) 

また、あなたはそれらの約束をネスト解除することができます

+0

「else」部分については心配しないでください。 – elclanrs

+0

あなたが言ったことの後で、 'catch'の中の' console.log'が実行されていますが、 'throw err'はプログラムをクラッシュさせていません。それはなぜだろう? – Weston

+0

'throw'はあなたのプログラムを約束どおりにクラッシュさせるべきではありません。 'promise.reject(err)'を返すと、 '.catch(err => throw err).catch(handleError)のように、後の' .catch() 'でエラーを処理するでしょう。 ) ' – elclanrs

3

呼び出しを拒否()してもプログラムが停止しない場合、以下のすべてのコードも実行されます。

if(err) { 
    console.log('2') // DOES run 
    reject(new Error(err)) 
} 
resolve(res.field) //Program crashes here because reject didn't actually reject 

から

if(err) { 
    console.log('2') // DOES run 
    reject(new Error(err)) 
} 
else { 
    resolve(res.field) //Program crashes here because reject didn't actually reject 
} 

*更新* か、 `約束をreturn`べきではありませんあなたは

if(err) { 
    console.log('2') // DOES run 
    return reject(err) // no need to new Error object 
} 
resolve(res.field) //Program crashes here because reject didn't actually reject 
+0

私もこれについて考えましたが、約束は1つの状態にしかないので、そうではありません。それが拒否すれば解決できません。私はそれが流れをより明確にするので、私はまだ 'else'と書いています。 – elclanrs

+0

、または上記の@elclanrsを更新する2番目の解決策に従うことができます。 –

+0

はい、解決策が呼び出されないと拒否すれば、それはもっと明確になりますが、依然として立っています。 https://jsfiddle.net/g8yufxfa/を参照してください。 – elclanrs

関連する問題