Почему мое обещание не будет возвращено, даже если оно работает - PullRequest
0 голосов
/ 23 февраля 2020

Я использую следующий код:

    let Payment =   relevantWaitList.map(e => {


        stripe.paymentIntents.create({
            amount: Math.round(e.totalCharge * 100),
            currency: currency,
            description: `Resale of ${eventData.title} refunded ticket`,
            // customer: customerStripeID,
            payment_method: e.paymentMethod,
            off_session: true,
            confirm: true,
            application_fee_amount: Math.round(e.applicationFee*100)
        }
        ,{
        stripe_account: organiserStripeAccountID,
        }
    )
})


    Promise.all(Payment)
    .then(data => {
        console.log('promiseall payment res', data)
         }).catch(err => {
           console.log('promise all payment fail', err)}

, который возвращает следующее:

promiseall payment res undefined

Несмотря на возвращение неопределенного значения, обещание. Все работает - намерения платежей чередуются созданы.

Когда я перехожу к обещанию включить .then в карту (используя приведенный ниже код), консоль прекрасно регистрируется, но я бы предпочел поиграть с данными после того, как все обещания будут выполнены.

Чего мне не хватает?

    let Payment =   relevantWaitList.map(e => {


        stripe.paymentIntents.create({
            amount: Math.round(e.totalCharge * 100),
            currency: currency,
            description: `Resale of ${eventData.title} refunded ticket`,
            // customer: customerStripeID,
            payment_method: e.paymentMethod,
            off_session: true,
            confirm: true,
            application_fee_amount: Math.round(e.applicationFee*100)
        }
        ,{
        stripe_account: organiserStripeAccountID,
        }
    )
     .then(data => console.log('data within map', data))
     .catch(err => console.log('err within map', err))
})

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Ваш .map() обратный вызов не возвращает ничего, что означает, что .map() просто вернет массив undefined, не давая Promise.all() никаких обещаний и данных для использования.

То, что вам нужно передать Promise.all() - это массив обещаний, каждое из которых разрешается в значение, тогда Promise.all() возвращает обещание, которое разрешается в массив этих значений. В этом случае у вас есть мусор в Promise.all() и, следовательно, мусор.

Итак, ваш обратный вызов .map() должен возвращать обещание, которое разрешается до значения, которое вы в конечном итоге захотите.

Предполагая, что stripe.paymentIntents.create() возвращает обещание, которое разрешается до значения, которое вы хотите, вы просто нужно добавить инструкцию возврата:

    let Payment = relevantWaitList.map(e => {

        // ******* Add return on next line *********
        return stripe.paymentIntents.create({
            amount: Math.round(e.totalCharge * 100),
            currency: currency,
            description: `Resale of ${eventData.title} refunded ticket`,
            // customer: customerStripeID,
            payment_method: e.paymentMethod,
            off_session: true,
            confirm: true,
            application_fee_amount: Math.round(e.applicationFee*100)
        } , {stripe_account: organiserStripeAccountID,
        });
     });
0 голосов
/ 23 февраля 2020

Как уже упоминалось в ответе от @ jfriend00, обратный вызов вашей карты ничего не возвращает.

Вам необходимо возвращать объект Promise для каждой итерации

const payments = relevantWaitList.map(e => {
  return stripe.paymentIntents.create({ 
    // your props
  });
});

Переменная payments теперь содержит массив обещаний. Вы можете использовать Promise.all() сейчас

Promise.all(payments).then(data =>{
  // play with data here :)
});
...