私は非同期プログラミングと約束についてたくさんの質問があることを知っていますが、別の関数で返されている約束をどのように返すべきかを理解するためには、この特定のコードの例が本当に必要です。別の関数の中にある約束から値を返すには?
私には2つの機能があります。最初のルートは、ルートに行くときに呼び出されます。このルートは支払いリンクを作成し、データベースに予約を保存する必要があります。
exports.create_booking = function(req, res) {
req.body.payment = exports.create_booking_payment(req.body.total_amount);
console.log(req.body.payment); // This returns ' Promise { <pending> } '
var new_booking = new Booking(req.body);
new_booking.save(function(err, booking) {
if (err)
res.send(err);
res.json(booking);
});
};
ただし、支払いリンクの作成は非同期メソッドで行われます。私の最初の問題は、メソッドコールバック関数内の支払いにしかアクセスできないということでした。
今私は、プロミスが作成され解決された別の(非同期)メソッドの中にメソッドをラップしました。このメソッドは、awaitステートメントで最初のメソッドに返されていますが、これはすべて「Promise {}」を返します。
これは、約束が解決される前にメソッドが返されているためです。しかし、私はなぜこれが理解できません。私の前提は、非同期関数が完了する前に 'await'ステートメントがメソッドを返すのを待つことです。
exports.create_booking_payment = async function() {
function asyncPayment() {
return new Promise (function(resolve, reject) {
mollie.payments.create({
amount: 20.00,
description: "Reservation code: ",
redirectUrl: "https://www.website.com/",
webhookUrl: ""
}, function(payment) {
if (payment.error) reject(payment.error)
else { resolve({
id: payment.id,
link: payment.getPaymentUrl(),
status: payment.status
})
}
});
});
}
return await asyncPayment();
}
私はあなたがasync
機能はまだ約束ではなく、実際の値を返すことを見逃しているように見える
、これと 、 'exports.create_booking_payment'関数は' async'を持つ必要はなく、戻り値は 'await'を必要としません。それは約束を返すからです。 – Kaddath
@Kaddath - そうです、それを追加しました。 – jfriend00
ありがとうございました!これは完全に機能しました。 – NvdB31