【问题标题】:Making API calls await等待 API 调用
【发布时间】:2018-05-14 09:19:15
【问题描述】:

我有这个代码:

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,
    });
}

看起来不错,但问题是,这段代码是异步的。所以当我尝试使用product 变量创建plan 时,它并不存在。

我可以使用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,所以我无法真正编辑任何内容。

【问题讨论】:

  • "node just said nope",似乎是一个很好的错误信息。如果你具体说明了什么,也许我们可以帮助解决这个问题。
  • 这是一个简单的语法错误。我会把它添加到帖子中
  • @Adriani6 我编辑了帖子。
  • 你的错误信息说明了一切......
  • 嗯,是的,但问题是,我怎样才能绕过它

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


【解决方案1】:

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

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

【讨论】:

  • 请重新格式化您的答案,使其对未来用户更具可读性。谢谢!
  • 没问题。希望它看起来更好。
  • 这样好多了。谢谢
【解决方案2】:

您的语法错误只是意味着您需要将函数标记为异步。如果 stripe.plans.create 是异步的,你可以给它添加 awaitable。

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,
    });
}

【讨论】:

  • 我投了赞成票。我看不到您的回答有任何反对意见
  • 它已被删除。我想这是因为在我的示例中错过了await,我在投票后修复了它。
【解决方案3】:

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

然后您将能够在代码行上使用await,或使用Promise .then 语法。例如:

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

【讨论】:

  • 对不起,你能举个例子吗?我不确定我是否能得到你
  • 编辑了答案
猜你喜欢
  • 2021-05-05
  • 2019-10-15
  • 2019-03-25
  • 2021-05-12
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2018-03-31
  • 2019-10-13
相关资源
最近更新 更多