Ожидание вызовов API - PullRequest
0 голосов
/ 14 мая 2018

У меня есть этот код:

function createPlan(amount) {
    return stripe.plans.create({
        product: 'DigitLead website evaluation tool',
        nickname: 'DigitLead website evaluation tool monthly charge',
        currency: 'cad',
        interval: 'month',
        amount: amount,
    });
}

var product = stripe.products.create({
    name: 'DigitLead website evaluation tool monthly charge',
    type: 'service',
});

console.log(time);
if (time === '1') {
    var amount = 1499;
    var days = 30;
    var plan = createPlan(1499);
}
else if (time === '3') {
    amount = 999 * 3;
    days = 90;
    plan = createPlan(999);
}

plan.then(p => console.log("p " + p));
if (typeof req.user.stripeId === undefined) {
    var customer = stripe.customers.create({
        email: req.user.username,
        source: req.body.stripeToken,
    });
}

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

Я могу использовать цепочку then, но это будет чертовски грязно.Я пытался сделать это с помощью добавления await, например:

var product = stripe.products.create({
    name: 'DigitLead website evaluation tool monthly charge',
    type: 'service',
});

, но узел просто сказал:

/home/iron/Documents/Projects/digitLead/routes/payment.js:46
var product = await stripe.products.create({
    ^^^^^

    SyntaxError: await is only valid in async function

Я не хочу использовать ад обратного вызова, поэтомуЯ действительно не знаю, что делать.В обычном коде я просто напишу функцию с именем async и верну обещание.Здесь я использую Stripe API, поэтому я не могу ничего редактировать.

Ответы [ 3 ]

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

Ваша синтаксическая ошибка означает, что вам нужно пометить функцию как асинхронную.Если stripe.plans.create является асинхронным, вы можете добавить к нему ожидаемый.

async function createPlan(amount) {
    return await stripe.plans.create({
        product: 'DigitLead website evaluation tool',
        nickname: 'DigitLead website evaluation tool monthly charge',
        currency: 'cad',
        interval: 'month',
        amount: amount,
    });
}
0 голосов
/ 14 мая 2018

Мы можем использовать только ожидание в асинхронной функции.Поэтому вы можете обернуть его в асинхронный IIFE:

var product = (async(name, type) => await stripe.products.create({
  name,
  type
}))(name, type);
0 голосов
/ 14 мая 2018

await может использоваться только в рамках асинхронной функции.Поэтому вам нужно пометить функцию, которую вы внутри, как async.Если вы не находитесь внутри функции, вам нужно будет обернуть свой код в функцию.

После этого вы сможете использовать либо await в строке кода, либо использовать синтаксис Promise .then.Например:

async function createProduct(name, type) {
    return await stripe.products.create({name, type});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...