Транспортир: Как работает promises?
У меня есть достойное представление о том, как работает библиотека $q в angular, но я не уверен, как их используют транспортир или веб-драйвер-js. (особенно потому, что использование немного отличается между транспортером/веб-драйвером/angular, я думаю)
Например, пример кода, который я видел в учебниках по утяжителям, как представляется, записывается по строкам и предполагает, что предыдущий закончен до следующего. (например, browser.get(url), за которым следует браузер .getTitle()) Есть ли какие-то неявные обещания? (Мне не нужно вручную откладывать разрешение/выполнение)
Я прочитал https://github.com/angular/protractor/blob/master/docs/getting-started.md
и снял ссылки на документацию webdriver и apractator транспортира, но мое понимание все еще немного нечеткое. Некоторые функции возвращают значения, а некоторые возвращают promises как странное сочетание синхронного и асинхронного кода.
Ответы
Ответ 1
Есть ли какие-то неявные обещания?
Глядя на https://github.com/angular/protractor/blob/master/docs/control-flow.md, похоже, что да, есть, используя очередь promises, называемую потоком управления. Итак, чтобы расширить ваш пример:
browser.get(url);
var title = browser.getTitle();
expect(title).toEqual('My Title');
Каждая из вышеперечисленных строк добавляет в очередь. Переменная title
на самом деле является обещанием, которое в соответствующей точке потока управления expect
распаковывается.
Ответ 2
Вот хорошая статья о потоке управления транспортиром, сама по себе вдохновленная API WebDriver.
Короче говоря (цитируя статью), вот как ControlFlow из WebDriver работает под капотом.
Когда вы пишете:
driver.get('http://www.example.com');
driver.findElement(elem).sendKeys('hello');
Что на самом деле происходит:
driver.get('http://www.example.com')
.then(function() {
return driver.findElement(elem);
})
.then(function(q) {
return q.sendKeys('hello');
});
Примечание. Я не намерен быть избыточным с принятым ответом, но я считаю, что увидеть, как promises на самом деле связаны друг с другом внутри, может помочь понять.