Asynchronous 如何用Jasmine/量角器将“AxeBuilder.analysis()”包装在promise中?

Asynchronous 如何用Jasmine/量角器将“AxeBuilder.analysis()”包装在promise中?,asynchronous,jasmine,promise,protractor,Asynchronous,Jasmine,Promise,Protractor,我一直在工作的茉莉自定义匹配器,以检查是否有一个网页是可访问的 重要的一点如下所示: var _result = {}; AxeBuilder(browser.driver).analyze(function(results) { if (util.equals(results.violations.length, expected)) { _result.pass = true; _result.message = 'Selection was acce

我一直在工作的茉莉自定义匹配器,以检查是否有一个网页是可访问的

重要的一点如下所示:

var _result = {};
AxeBuilder(browser.driver).analyze(function(results) {
    if (util.equals(results.violations.length, expected)) {
        _result.pass = true;
        _result.message = 'Selection was accessible.';
    } else {
        _result.pass = false;
        _result.message = results.violations;
    }
});
return result;
我的问题是
\u result
(而不是
results
)始终是空对象

我怀疑问题在于
AxeBuilder(…).analyze(…)
是异步的,但不返回承诺

我的测试不是从业力运行的,而是通过量角器配置启动的


如果我的怀疑是真的,我该如何把它包装成承诺呢?

我对AxeBuilder不熟悉。正如您提到的,AxeBuilder.analyze()是一个异步方法,您需要在analyze方法中返回
\u result
变量。试试下面的代码

return AxeBuilder(browser.driver).analyze(function(results) {
  if (util.equals(results.violations.length, expected)) {
    _result.pass = true;
    _result.message = 'Selection was accessible.';
  } else {
    _result.pass = false;
    _result.message = results.violations;
  }
   return _result;
});

在执行analyze方法之前,您在代码中返回
\u result
变量。

您可以实现回调概念,以防止在result对象准备就绪之前执行语句“return result”。你可以试试下面的代码

 var _result = {firstvalue:"test"};
 AxeBuilder(browser.driver).analyze(function(results,callback) {
      if (util.equals(results.violations.length, expected)) {
           _result.pass = true;
           _result.message = 'Selection was accessible.';
       } else {
         _result.pass = false;
         _result.message = results.violations;
      }
     callback(result);
  });

var callback=function(result){
   return result;
  }

如果可能,您应该使用量角器中提供的WebDriverJS承诺

function builder() {
      return AxeBuilder(browser.driver).analyze(function(results) {
         var deferred = protractor.promise.defer();
         if (util.equals(results.violations.length, expected)) {
           _result.pass = true;
           _result.message = 'Selection was accessible.';
           deferred.fulfill(_result);
         } else {
           _result.pass = false;
           _result.message = results.violations;
           deferred.reject(_result);
         }
         return deferred;
     });
}
这是你可以使用它的方法

 builder().then(function(_result) {
        console.log(_result.pass);
    }, function(err) {
       console.error(err);
 });

谢谢你的快速回复。这似乎不起作用,因为它不返回承诺,我的代码的其余部分在完成工作之前执行。我想我需要用承诺来包装它(不知何故)。这很有趣,看起来很有希望(没有双关语),但对我来说仍然不起作用。我认为
AxeBuilder(browser.driver)。analyze
失败了。回调是否在被调用的范围内?也许在里面添加一个控制台日志,看看它是否到达那里?我没有成功。对不起,情况没有改变
result。pass
是未定义的。@atwright147,创建一个具有任何值的对象,而不是创建空的obejct var\u result={first:“Test”};