使API调用等待

时间:2018-05-14 09:19:15

标签: javascript node.js express asynchronous stripe-payments

我有这段代码:

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 :(得分:3)

我们只能在async函数中使用await。因此,您可以将其包装在异步IIFE中:

var product = (async(name, type) => await stripe.products.create({
  name,
  type
}))(name, type);

答案 1 :(得分:2)

await只能在异步函数中使用。因此,您需要将您所在的功能标记为async。如果您不在函数内部,则需要将代码包装到函数中。

然后,您就可以在代码行上使用await,或使用Promise .then语法。例如:

async function createProduct(name, type) {
    return await stripe.products.create({name, type});
}

答案 2 :(得分:2)

您的语法错误仅表示您需要将该函数标记为异步。如果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,
    });
}