Javascript 函数以等待承诺并检索结果

Javascript 函数以等待承诺并检索结果,javascript,promise,protractor,Javascript,Promise,Protractor,我有一个量角器调用,它返回一个承诺,承诺包含一个值 var e = element.all(by.css("selector")).first(); e.getAttribute('id').then(function (text) { console.log(text); }); 我想对从getAttribute()返回的承诺进行分析,并检索结果文本 这需要是一个阻塞函数;然后添加,将需要重写许多现有测试。我怎么写这个 编辑: 我试图做的是从页面中检索一个值,并使用它构建一个元素选择

我有一个量角器调用,它返回一个承诺,承诺包含一个值

var e = element.all(by.css("selector")).first();

e.getAttribute('id').then(function (text) {
  console.log(text); 
});
我想对从
getAttribute()
返回的承诺进行分析,并检索结果文本

这需要是一个阻塞函数;然后添加
将需要重写许多现有测试。我怎么写这个

编辑:

我试图做的是从页面中检索一个值,并使用它构建一个元素选择器。因此:

  • 查找元素一的动态ID:
    element.all(by.css(“…”).first().getAttribute('ID')
  • 基于该值构建选择器:
    var elementSelector='#X'+elementOneID+'-Y'
  • 查找并处理元素二:
    element(by.css(elementSelector))…
  • 我会接受任何允许我这样做的答案

    编辑2:

    显然,如果没有回调,这是不可能的。我结束了。

    你是说这个

    var e = element.all(by.css("selector")).first();
    browser.wait(function() {
            return e.getAttribute('id').then(function (id) {
                  if(id === 'oneIWant') {
                      return true;
                  } else {
                      return false;
                  }
              });
    },3000,'Waiting for the id value to be something awesome');
    
    编辑1 从WebDriverJS文档中,您可以找到以下报价。因此,如果您有一系列selenium webdriver命令,它们将被推送到promise manager队列,并将一个接一个地执行。当您说wait没有阻止下一个命令时,它肯定意味着您的等待条件不正确

    promise manager维护一个调度任务队列,执行 队列中每个队列的前一个队列完成一次。网络驱动程序 API是在promise manager之上分层的

    编辑2 请检查量角器的预期条件


    你不能真的阻止。由于JavaScript是单线程的,所以在等待时不会发生任何事情。如果你阻止,量角器将永远无法解决承诺

    您可以通过获得阻塞承诺的外观,但该功能只有在使用诸如babel之类的transpiler时才可用


    但是,我相信@nilesh的答案正是你想要的<代码>浏览器。等待
    基本上会反复运行一个函数,直到它返回
    true
    ,或者它超时,但它不会阻塞线程。

    我不认为我必须说这是不可能的。你是否尝试过将类似逻辑应用于事件发射器或异步?我看到了这个项目。会有帮助吗@杰里米:太棒了!不幸的是,我们使用角度测试,并且有大量的量角器测试。@TrueWill-我想知道。传入回调方法是否有助于避免重写所有测试?比如,如果测试方法是回调?然后你可以做一些类似于
    getAttributeValueAndExecuteCallback(选择器,属性,回调){/..code。然后(回调(attributeValue));/..code}
    感觉这比重新编写所有测试更容易?但如果没有亲眼看到他们,我不确定。让我知道结果如何!这很接近,但是我需要
    getAttribute()
    wait
    返回后的结果(我不知道它是什么;这是一个简化的示例)。我假设我必须从外部范围关闭一个变量,然后返回true?@TrueWill你当然可以这样做。或者说,这是你唯一的选择,IMHOIt不起作用。我认为这是把事情搞砸了。如果我只想
    expect
    ,我会很好,但我需要值来构建选择器来查找我的元素。简言之,我正在处理这个问题:我希望
    等待
    有效地阻止,直到完成,但情况似乎并非如此。
    
    var EC = protractor.ExpectedConditions;
    
    var e = element.all(by.css("...")).first();
    browser.wait(EC.presenceOf(e), 10000);
    
    if(e.isPresent()) {
      e.getAttribute('id').then(function(elementOneID) {
         var elementSelector = '#X' + elementOneID + '-Y';
         var el = element(by.css(elementSelector));
         browser.wait(EC.presenceOf(el), 10000);
         el.click(); //or do stuff
      });
    }