2016-08-13 7 views
0

関数getStuffは機能しますが、.getメソッドにエラーがあるときはいつでも問題に遭遇します。 getStuff2を参照してください。スーパーエージェントによる約束

const request = require('superagent'); 

function getStuff() { 

    return new Promise(function (resolve, reject) { 
    request 
     .get('http://google.com') 
     .end(function (err, res) { 
     console.log('getting to end cb'); 
     if (err) reject(err); 
     resolve(res.body); 
     }) 
    }); 

} 

function getStuff2() { 

    return new Promise(function (resolve, reject) { 
    request 
     .get('abc') 
     .end(function (err, res) { 
     console.log('getting to end cb'); 
     if (err) reject(err); 
     resolve(res.body); 
     }) 
    }); 

} 

//works 
getStuff().then(function (htmlBody) { 
    console.log(htmlBody); 
}).catch(function(err) { 
    console.log('err'); 
}); 

//doesn't work 
getStuff2().then(function (htmlBody) { 
    console.log(htmlBody); 
}).catch(function(err) { 
    console.log('err'); 
}); 

私はキャッチでコンソールログメッセージが表示されていないためたSuperAgentからエラーがgetStuff2で正しく処理取得されていないように思えます。

答えて

1

@robertklepが指摘したように、DNSあり

それはあなたが約束を拒否した後、現在の関数を終了することをお勧めします解像度の問題。ここには、ローカルにルーティングされたDNSワイルドカードstats.research.icann.org/dns/wildcardがあります。コードを別のダミーURLに変更すると、エラーがキャッチされます。すなわち

const request = require('superagent'); 

function getStuff2() { 

    return new Promise(function (resolve, reject) { 
    request 
     .get('bing-bong-bang') 
     .end(function (err, res) { 
     console.log('getting to end cb'); 
     if (err) return reject(err); 
     resolve(res.body); 
     }) 
    }); 

} 

getStuff2().then(function (htmlBody) { 
    console.log(htmlBody); 
}).catch(function(err) { 
    console.log('err'); 
} 

この例では、エラーが適切にキャッチされています。 DNSエラーは最終的にタイムアウトになりますが、1分かかります。

0

代わりにこれを試してみてください:

getStuff2().then(function (htmlBody) { 
    console.log(htmlBody); 
}, function(err) { 
    throw err; 
}).catch(function(err) { 
    console.log(err.message); 
}); 

がエラーをスローしません拒否、あなた自身のことについて責任があります。

+0

'reject()'は '.catch()'の呼び出しを引き起こすはずです。 – robertklep

+0

これは、 'getStuff2()'が終了しないので、ちょうどハングする場所で私と同じ問題があります。 – user3795202

1

あなたが経験している正確な問題について非常にあいまいだが、それは、このコードで私のために失敗します。

if (err) reject(err); 
resolve(res.body); 

rejectを呼び出すと、そう、残りのコードが実行を停止することはありません。 resが定義されていない(したがって、res.bodyにアクセスするとTypeErrorを投げる)ため、後続の例外が発生します。

if (err) return reject(err); 

それともそれがあれば、他ます:

if (err) { 
    reject(err); 
} else { 
    resolve(res.body); 
} 
+0

曖昧さが残念です。問題は、 'getStuff2'に' console.log( 'err') 'メッセージが表示されないことです。それで、私はエラーが正しく処理されていないと言っていたのです。 – user3795202

+0

@ user3795202それは投げられている 'TypeError'のためです。 – robertklep

+0

これは私には当てはまりません。私はこのconsole.logを 'console.log( 'cbを終了する');'のどちらかに見えません。だから私のコードはスーパーエージェント '.end'コールバックにさえ達していません。私はノード '6.3.0'とネイティブの約束を使っています(問題ではありません)。また、私のプログラムはちょうどぶら下がっています。 – user3795202