約束はコールバックではなく、魔法のために抽象化したものです。非同期コードを同期させることはできません。
正しい解決策は次のとおりです。
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
とコールバックを持っている機能)を変換するために、このような機能を提供します。
または、コールバックを使用してください。
約束を使用しても、コードは同期しません。 'res.then(function(ret){console.log(ret);})' – Keith
@adeneoはここで皮肉っている必要はありません。あなたは初心者でした。 –
さて、実際に約束事、非同期/待機、コールバックをどこで使用したのか疑問に思ったことがあるので、無作為の質問をコピー/ペーストするだけでない限り、非同期なことははっきり分かりますか? – adeneo