2017-09-08 5 views
1

私は非同期関数の値を取得する必要があります。私は約束を使用しようとしましたが、それは動作しません:JS:Promiseが値を返さない

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (!err) resolve(size) 
    }) 
}) 
console.log(res) 

私が得る結果はPromise { <pending> }

+2

約束を使用しても、コードは同期しません。 'res.then(function(ret){console.log(ret);})' – Keith

+6

@adeneoはここで皮肉っている必要はありません。あなたは初心者でした。 –

+1

さて、実際に約束事、非同期/待機、コールバックをどこで使用したのか疑問に思ったことがあるので、無作為の質問をコピー/ペーストするだけでない限り、非同期なことははっきり分かりますか? – adeneo

答えて

6

約束はコールバックではなく、魔法のために抽象化したものです。非同期コードを同期させることはできません。

正しい解決策は次のとおりです。

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (err) reject(err); 
    else resolve(size); 

    }) 
}); 

res.then(function(promiseResolutionValue) { 
    console.log(res) 
}) 

あなたがここにもasync/awaitを使用することができます。

const getSize = readStream => { 
    return new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
     if (err) reject(err); 
     else resolve(size); 
    }) 
    }); 
} 


let printSize = async readStream => { 
    console.log(`Size is ${await getSize(readStream)}`); 
} 

それとも、あなたはNodeJS(バージョン8+)を使用している場合、あなたは適応することができるかもしれないがあなたの機能を使用するutil.promisify
その他Promise図書館などBluebirdは、また、簡単に約束を返す同等に「標準」ノード形式の関数(引数としてerr, dataとコールバックを持っている機能)を変換するために、このような機能を提供します。

または、コールバックを使用してください。

+0

私はあなたがよかったかもしれないと思うが、これは正解です! –

+0

また、 'async' /' await'をこの例に追加することもできます。これは魔法であり、同期の_make非同期コードのようなものです。 – msanford

+0

私は全く無礼ではありませんでした。 – nadavvadan

0

あなたのコードは次のように見えたする必要があります。

const res = new Promise(function (resolve, reject) { 
    gm(readStream).size({ bufferStream: true }, function (err, size) { 
    if (!err) resolve(size) 
    else reject(err) 
    }) 
}) 

function onResolved(data) { 
    console.log('data: ', data); 
} 

function onRejected(err) { 
    console.log('err:', err); 
} 

res.then(onResolved, onRejected); 

約束はあなたのコードの同期をしない、それはあなたがいないすぐにcallbackスタイルと同じように、結果を取得したいとき、あなたがコントロールすることができます。