我有一个问题,我似乎无法弄清楚。我需要只有在循环中一个接一个地完成时才发生此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')
}
我相信您的代码存在一些问题。
首先是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);
}
}