Promises 的一大优点是您可以保持异步代码线性而不是嵌套(来自延续传递风格的回调地狱)。
Promise 为您提供 return 语句和错误抛出,而您会因延续传递风格而失去这些。
在您的情况下,您需要从您的承诺返回函数中返回承诺,以便您可以链接您的承诺。
示例:Promise.all 接受一个 promise 数组,并在所有 promise 解析后解析,如果有任何一个被拒绝,则该数组被拒绝。
this.waitForElementsToBecomeVisible = function() {
return Promise.all([
driver.wait(webdriver.until.elementIsVisible(usernameTextField), 500),
driver.wait(webdriver.until.elementIsVisible(firstNameTextField), 500),
driver.wait(webdriver.until.elementIsVisible(lastNameTextField), 500),
driver.wait(webdriver.until.elementIsVisible(createEmployeeButton), 500)
]);
}
然后你可以链接你的承诺。
driver.get('https://website.com/login').then(function () {
loginPage = new LoginPage(driver);
return loginPage.login('company.admin', 'password')
}).then(function () {
employeePage = new EmployeePage(driver);
return employeePage.clickAddEmployee()
}).then(function () {
addEmployeeForm = new AddEmployeeForm(driver);
/**
*
* Wait for elements to become visible
*/
return addEmployeeForm.waitForElementsToBecomeVisible();
}).then(function() {
return addEmployeeForm.completeForm(employee);
}).then(function() {
return addEmployeeForm.clickCreateEmployee();
}).then(function() {
return employeePage.searchEmployee(employee);
});
您可以看到上面的示例没有嵌套并且更易于维护。您返回一个承诺并继续链接而不是嵌套。我希望这对您有所帮助,并且不会让您感到困惑。