为什么每个循环的附加值没有存储在下一次迭代中?
Why added value en each loop hasn't been stored on next iteration?
接下来是简要逻辑:点击'li'元素后,发送请求,根据'contacts'的响应值,如果大于0则应该select,一旦找到这样的元素,我需要打破每个循环。但是目前,尽管我设置了值,但它应该会在下一次迭代时打破每个循环(returns false)。 count[] 已恢复为旧值,有什么问题吗?
cy.get('div[id=company_select]').then($el => {
const count = []
cy.wrap($el).click().find('li').each((element, index) => {
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps')
cy.log(count.length)
if (count.length > 0) {
return false
} else {
cy.wrap(element).click().wait('@getCompanyProps').then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el).find('button[vs__clear]').click()
} else {
count.push(1)
cy.log(count.length)
}
})
}
})
})
在这种情况下,您不能 early-exit 与 return false
,但您可以使用 count
来防止在 body.contacts.length > 0
之后的内部执行。
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps') // this can be here
cy.get('div[id=company_select]').then($el => {
const count = []
cy.wrap(count).as('count') // make an alias value of the count variable
cy.wrap($el).click().find('li')
.each((element, index) => {
cy.get('@count').then(count => { // retrieve count asynchronously
if (count.length === 0) { // no result yet?
cy.wrap(element).click().wait('@getCompanyProps')
.then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el).find('button[vs__clear]').click()
} else {
count.push(1)
console.log(count.length)
}
})
}
})
})
})
此行为的原因是 .wait('@getCompanyProps')
等异步命令与检查提前退出的同步代码的混合。
如果您使用 console.log()
而不是 cy.log()
来调试这些值,您将看到提前退出之前的所有日志 运行 在 count.push(1)
之后的日志之前.
如果我对你的问题的理解正确,你想知道为什么在柏树的第二次循环中每个循环 cy.wrap($el).click().find('li').each((element, index) => {
cy.log(count.length)
等于 0。
即使在另一个 then 循环 cy.wrap(element).click().wait('@getCompanyProps').then((interception) => {
中进一步向下,您也会将计数增加 count.push(1)
并在 cy.log(count.length)
之后 returns 1.
简短的回答是范围。如果您将柏树循环中的变量更改为 return 该变量,则需要在 .then( () =>{ cy.wrap(count)}
之后添加类似的内容 我的解决方案在下面,但如果需要,我也更改了 const count = []
知道为什么我建议阅读 What is the difference between 'let' and 'const' ECMAScript 2015 (ES6)?
const count = []
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps')
cy.get('div[id="company_select"]')
.then( ($el) => {
cy.wrap($el)
.click()
.find('li')
.each( ($el) => {
if (count.length === 0){
cy.wrap($el)
.click()
.wait('@getCompanyProps')
.then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el)
.find('button[vs__clear]')
.click()
} else {
count.push(1)
cy.log(count.length)
}
})
}
})
.then( () =>{
cy.wrap(count).as('count')
})
})
cy.get('@count')
.then( (count) =>{
cy.log(count.length)
})
接下来是简要逻辑:点击'li'元素后,发送请求,根据'contacts'的响应值,如果大于0则应该select,一旦找到这样的元素,我需要打破每个循环。但是目前,尽管我设置了值,但它应该会在下一次迭代时打破每个循环(returns false)。 count[] 已恢复为旧值,有什么问题吗?
cy.get('div[id=company_select]').then($el => {
const count = []
cy.wrap($el).click().find('li').each((element, index) => {
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps')
cy.log(count.length)
if (count.length > 0) {
return false
} else {
cy.wrap(element).click().wait('@getCompanyProps').then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el).find('button[vs__clear]').click()
} else {
count.push(1)
cy.log(count.length)
}
})
}
})
})
在这种情况下,您不能 early-exit 与 return false
,但您可以使用 count
来防止在 body.contacts.length > 0
之后的内部执行。
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps') // this can be here
cy.get('div[id=company_select]').then($el => {
const count = []
cy.wrap(count).as('count') // make an alias value of the count variable
cy.wrap($el).click().find('li')
.each((element, index) => {
cy.get('@count').then(count => { // retrieve count asynchronously
if (count.length === 0) { // no result yet?
cy.wrap(element).click().wait('@getCompanyProps')
.then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el).find('button[vs__clear]').click()
} else {
count.push(1)
console.log(count.length)
}
})
}
})
})
})
此行为的原因是 .wait('@getCompanyProps')
等异步命令与检查提前退出的同步代码的混合。
如果您使用 console.log()
而不是 cy.log()
来调试这些值,您将看到提前退出之前的所有日志 运行 在 count.push(1)
之后的日志之前.
如果我对你的问题的理解正确,你想知道为什么在柏树的第二次循环中每个循环 cy.wrap($el).click().find('li').each((element, index) => {
cy.log(count.length)
等于 0。
即使在另一个 then 循环 cy.wrap(element).click().wait('@getCompanyProps').then((interception) => {
中进一步向下,您也会将计数增加 count.push(1)
并在 cy.log(count.length)
之后 returns 1.
简短的回答是范围。如果您将柏树循环中的变量更改为 return 该变量,则需要在 .then( () =>{ cy.wrap(count)}
之后添加类似的内容 我的解决方案在下面,但如果需要,我也更改了 const count = []
知道为什么我建议阅读 What is the difference between 'let' and 'const' ECMAScript 2015 (ES6)?
const count = []
cy.intercept('GET', '**/company/view-json**').as('getCompanyProps')
cy.get('div[id="company_select"]')
.then( ($el) => {
cy.wrap($el)
.click()
.find('li')
.each( ($el) => {
if (count.length === 0){
cy.wrap($el)
.click()
.wait('@getCompanyProps')
.then((interception) => {
if (interception.response.body.contacts.length === 0) {
cy.wrap($el)
.find('button[vs__clear]')
.click()
} else {
count.push(1)
cy.log(count.length)
}
})
}
})
.then( () =>{
cy.wrap(count).as('count')
})
})
cy.get('@count')
.then( (count) =>{
cy.log(count.length)
})