2017-09-03 16 views
4
let request = require('request-promise') 

function get(url) { 
    let _opt = {} 
    let response = (async() => { 
    try { 
     var ret = await request(url, _opt); 
     return ret; 
    } catch (e) { 
     console.log(e) 
    } 
    })(); 
    return response 
} 

console.log(get('http://www.httpbin.org/ip')) 

が与える約束保留ん:なぜ待つ関数の戻り値は

Promise { <pending> } 

なぜそれが私の応答を待ちませんか?

答えて

3

なぜそれが私の応答を待ちません "落とし穴1待っていませんか"?シンプルだ


ので、あなたは約束を戻ってきています。ノードjsはシングルスレッドであり、非ブロッキングの方法で実行されます。あなたの機能を取得中リターン応答応答変数の解像度前に実行されることを意味し

は、次のように試してみてください。

let request = require('request-promise') 

function get(url) { 
    let _opt = {} 
    return request(url, _opt); 
} 

async function some() { 
    console.log(await get('http://www.httpbin.org/ip')); 
} 

some(); 

また、この例では、約束を返しているが、この場合には、我々は約束解決のためを待っています。

このヘルプが必要です。

+0

それは私が欲しいものではありません。関数が応答を返すようにしたい。これはできないと言っていますか? – pguardiario

+2

@pguardiarioできません。最初にコールバックから始め、非同期/待機のようなもっと複雑なものを掘り下げる前に、非同期実行用にコードを構造化する方法を学ぶことを強くお勧めします。 – slebetman

+0

しかし私はなぜか分からない。関数がブロックされていることがわかります。つまり、関数が戻る前にリソースがロードされています。なぜ私はそれを直接アクセスできないのですか? – pguardiario

2

非同期関数は非ブロッキングであり、結果を待つのではなく、すぐに約束を返します。これは、例えば、複数の非同期関数が、それぞれが順次実行されるのではなく、同時に実行されることを可能にする。

結果を待つために、awaitキーワードを使用して、約束が解決されるまでブロックすることができます。 awaitコマンドは、約束の結果を返します。例えば、get関数の結果をログに記録するには、最後の行を変更することができます。

console.log(await get('http://www.httpbin.org/ip')) 

UPDATE:私は暴行していた場合

は申し訳ありませんが(私はこの1つ以上試してみてみましょうここの死んだ馬)。

response変数は非同期関数なので、戻り値の型は非同期関数の定義による約束です。変数retが待たれているにもかかわらず、変数retに書き込む間にブロックされることを意味します。完了するためには、response非同期機能を完了まで実行する必要があります。あなたは、戻り値を待ってから、後処理を追加したい場合は、ここでのawaitは有用であろうが、この例では具体的には、あなたのtryブロックは、単純に次のようになります。request以来

try { 
    return request(url, _opt) 
} 

がすでに約束を返し、暗黙のうちに余分な約束事を生み出すため、余分なオーバーヘッドが発生することを余儀なくされています。

responseが約束しており、responseを返すので、getという関数も約束を返しています。あなたはこの約束を記録しようとしています(明らかにうまくいかない)。このため、awaitまたは.thengetの結果を得る必要があります。

出典:下https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8

+0

それはそうではありません。私は待っていると待っていると待っている使用しています。また、awaitは非同期関数内でのみ使用できます。 – pguardiario

+0

申し訳ありませんが、私は最高のjavascriptではないですが(私はasync-awaitをC#で使っています)。おそらく、次のようなことを試すことができます:get( 'http://www.httpbin.org/ip').then(response => console.log(response)) –

+0

お試しいただきありがとうございます。 – pguardiario