Использование значений в разных массивах - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 2 массива, извлеченных из базы данных и полосы соответственно.Оба данных были отображены с использованием общего поля.При попытке обработать платежи я получаю эту ошибку StripeInvalidRequestError ---- There is currently another in-progress request using this Stripe token.То есть цикл определенно выполняется дважды.Поэтому мой вопрос заключается в том, как мне эффективно использовать данные из обоих массивов без повторения циклов дважды?

Есть мысли, пожалуйста?

array1 = [ 
  { totalCharge:  10000 },
  { totalCharge:  30000 },
]

 array2 = [
   { customer: 63667363,
     source:  "kssgjag_98899"
   },
   { customer: 767897889
     source:  "hkhdgd_93762"
   },
 ]

 for (let x of array1){
    for (let y of array2){
       stripe.charges.create({
           amount: x.totalCharge,
           currency: "usd",
           customer: y.id,
           source: y.source
       }, function(err, charge) {}
    }
  }

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы посещаете каждую комбинацию 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));
0 голосов
/ 23 мая 2018

Вот рабочий пример, который приводит к новому массиву array3, который имеет сжатый результат.

const array1 = [ 
  { totalCharge:  10000 },
  { totalCharge:  30000 },
]

 const array2 = [
   { customer: 63667363,
     source:  "kssgjag_98899"
   },
   { customer: 767897889,
     source:  "hkhdgd_93762"
   },
 ]

const array3 = [];
for (let x of array1) {
  for (let y of array2) {
    array3.push({
      amount: x.totalCharge,
      currency: "usd",
      customer: y.customer,
      source: y.source
    });
  }
}

console.log(JSON.stringify(array3));

Вывод:

[
    {"amount":10000,"currency":"usd","customer":63667363,"source":"kssgjag_98899"},
    {"amount":10000,"currency":"usd","customer":767897889,"source":"hkhdgd_93762"},
    {"amount":30000,"currency":"usd","customer":63667363,"source":"kssgjag_98899"},
    {"amount":30000,"currency":"usd","customer":767897889,"source":"hkhdgd_93762"}
]

Вам нужно будет сделатьвзимать с вашего сервера запрос на каждый из них, ожидая завершения предыдущего запроса, прежде чем начинать следующий:

function processCharges(charges: any[], index = 0) {
  stripe.charges.create(charges[index], (err, charge) => {
    if (err) {
      // handle error
    }

    index++;
    if (index < charges.length) {
      processCharges(charges, index);
    }
  });
}
...