了解量角器对承诺的使用 [英] Understanding protractor's use of promises

查看:102
本文介绍了了解量角器对承诺的使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本上我正在玩一个用于设置前置条件的库(想想用户创建)。由于量角器是基于承诺的,并且神奇地做所有包装以保持事物为了,我想到了为此目的使用承诺。我写了一些示例代码,但我无法解释观察到的行为,所以也许有人可以帮我理解发生了什么。

Essentially I am playing around with getting a library for preconditions set up (think user creation). As protractor is promise-based and magically does all the wrapping to keep things in order, I thought of using promises for that purpose. I wrote a little sample code but I cannot explain the observed behaviour so maybe someone can help me understand what's going on.

function timeout(ms) {
    var promise = protractor.promise.defer();
    setTimeout(function() {
        console.log('qwer');
        promise.fulfill(true);
    }, ms);
    return promise.promise;
}

所以现在函数返回一个promise,我假设它可以在线使用就像这样(因为所有代码都应该包含在控制流中)

So now the function returns a promise, which I would assume to be usable inline just like so (as all the code supposedly gets wrapped in a control flow)

describe('test', function() {
  it('bla', function() {
    browser.get('/');
    timeout(5000);
    $('some-element').click();
  });
});

但是这不能按预期工作(即console.log永远不会发生)。即使期望来自该承诺的结果,它也不会改变结果。如果通过执行 timeout(5000).then(done)实际显式等待完成,则超时完成,但是下一个操作在该操作之后没有排队(即站点获取打开,元素点击,然后5秒后超时日志发生)。

however this does not work as expected (i.e. the console.log never happens). Even when expecting the result from that promise, it does not change the results. If actually explicitly waiting for done by doing timeout(5000).then(done), the timeout completes, but the next action is not queued to after that action (i.e. site gets opened, element clicked, then after 5 seconds the log from timeout happens).

所以我真的很困惑如何使用控制流来确保一切都被执行按顺序和观察到的行为相互配合。

So I am really confused how the claims of using a control flow to make sure everything gets executed in order and the observed behaviour fit together.

推荐答案

仅仅创建一个 protractor.promise是不够的延迟对象 - 您需要告诉控制流程。这通常使用 protractor.promise.controlFlow()。执行()

It's not enough just to create a protractor.promise deferred object - you need to tell the control flow about it. This is usually done with protractor.promise.controlFlow().execute().

function timeout(ms) {
  protractor.promise.controlFlow().execute(function() {
    var deferred = protractor.promise.defer();
    setTimeout(function() {
      console.log('qwer');
      deferred.fulfill(true);
    }, ms);
    return deferred.promise;
  });
}

通读 https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js 对于幕后所有的魔术。

Read through https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js for all the magic behind the scenes here.

这篇关于了解量角器对承诺的使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆