Await不等待api发布完成,只是同时发生

问题描述 投票:2回答:1

我有一个问题,我似乎无法弄清楚。我需要只有在循环中一个接一个地完成时才发生此await调用,但是似乎它只是在同一时间快速调用了两次,这并没有使api发布正常工作。

我曾尝试使用async,await,但是await似乎不喜欢它处于两个循环中。有没有人有更好的解决方案?

async pushToCreate() {
    const toCreate = this.json.toCreate

    let counter = 0

    // toCreate Sample = { en: [{}, {}] }, { fr: [{}, {}] }

    Object.keys(toCreate).forEach((item) => {
        toCreate[item].forEach((el) => {
            const lang = item
            const dataContent = el

            await this.wp.products().param('lang', lang).create({
                title: dataContent.dgn,
                fields:  dataContent,
                status: 'publish'
            }).then(function( response ) {
                counter++
            }).catch(function(err) {
                console.log('error in create', err)
            })

            console.log('await finished')
        })
    })

    // should console log when above is finished
    console.log('END')
}
javascript async-await
1个回答
0
投票

我相信您的代码存在一些问题。

首先是await仅在函数返回promise时起作用。返回promise的函数最初将返回一个值,该值指示promise处于未决状态。如果您在等待右侧的功能没有返回承诺,它将不会等待。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

第二是您还使用了.then()方法,当实现诺言时,它会触发其回调参数。我认为您不能同时使用await和.then()。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

如果您希望使用与.then().catch()模式类似的格式,则可以将try / catch块与async / await一起使用。

async function f() {

  try {
    let response = await fetch('/example');
    let user = await response.json();
  } catch(err) {
    // catches errors both in fetch and response.json
    alert(err);
  }
}

https://javascript.info/async-await

© www.soinside.com 2019 - 2024. All rights reserved.