Вы посещаете каждую комбинацию x и y только один раз (всего четыре комбинации), но из последующих комментариев выясняется, что вы не хотите этого делать, вы хотите два платежа: 10000 для kssgjag_98899 и 30000 для hkhdgd_93762.
Самое простое, что можно сделать, это, вероятно, создать себе один массив зарядов, а затем обработать его по одному заряду за раз.
Сборка массива:
if (array1.length !== array2.length) {
throw new Error("Arrays should be of the same length");
}
const charges = array1.map(({totalCharge}, index) {
const {id, source} = array2[index];
return {
amount: totalCharge,
currency: "usd",
customer: id,
source
};
});
Обрабатывая их по одному: Николас Такаши рассказал мне в комментарии к удаленному сейчас ответу, что в дополнение к обратному вызову, stripe.charges.create
также возвращает обещание.Если это так, вы можете использовать классический трюк reduce
:
const promiseForResult = charges.reduce(
(p, charge) => p.then(() => stripe.charges.create(charge)),
Promise.resolve()
);
, который обеспечит вам только один вызов stripe.charges.create
, происходящий в любой момент времени.
Если этохорошо, чтобы вызовы перекрывались (но из-за вашей ошибки это звучит так, как будто это не так), вы бы использовали Promise.all
вместо:
const promiseForResult = Promise.all(
charges.map(charge => stripe.charges.create(charge))
);
Если это не правда, что stripe.charges.create
возвращает обещание, вы можете легко дать себе упаковку, которая:
const createCharge = charge => new Promise((resolve, reject) => {
strip.charges.create(charge, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
и затем по одному:
const promiseForResult = charges.reduce(
(p, charge) => p.then(() => createCharge(charge)),
Promise.resolve()
);
или все сразу:
const promiseForResult = Promise.all(charges.map(createCharge));