【问题标题】:protractor - how to get the result of an array of promises into another array量角器 - 如何将一组承诺的结果放入另一个数组
【发布时间】:2025-12-31 17:45:02
【问题描述】:

我从这段代码中得到了一系列承诺:element.all(by.repeater('unit in units')),我发现很难将数据放入另一个数组中:

element.all(by.repeater('unit in units')).then(function (arr) {
    var items = [];

    for (var i = 0; i < arr.length; i++) {
      arr[i].getText().then(function(text) {
        items.push(text);
      });
    }

   //PROBLEM ITEMS is Empty
   console.log(items);
});

【问题讨论】:

    标签: javascript arrays angularjs protractor


    【解决方案1】:

    设法以更简单的方式获得相同的结果,避免使用 Q 和中继器。使用内置地图就可以了。

    var tabs = element.all(by.css('.unitTabs li a')).map(function (elm) {
        return elm.getText();
    });
    
    tabs.then(function (result) {
        var sorted = _.sortBy(result, function (name) { return name; });
        for (var i = 0; i < result.length; i++) {
            expect(result[i]).toBe(sorted[i]);
        }
    });
    

    【讨论】:

    • 我很高兴有人在使用我的地图实现!
    • 谢谢安德烈斯,非常方便的工具,你有任何类型的博客/wiki,我们可以看到更多关于请求的细节吗?我问的原因是因为我发现它挂在网络上的某个地方进行测试,而不是正确的文档
    • 你也可以使用protractor.promise.all,见spin.atomicobject.com/2014/12/17/…
    • tabs 地图中应该期待什么,关键是什么,价值是什么?你能把它添加到答案吗?
    【解决方案2】:

    使用 Q 修复

    var Q = require('q');
    
    element.all(by.repeater('unit in units')).then(function (arr) {
        var promises = [];
        for (var i = 0; i < arr.length; i++) {
            promises.push(arr[i].getText());
        }
    
        Q.all(promises).done(function (result) {
            // print the results when the lookups and processing are done                
            console.log(result.length);
            console.log(result);                
        });
    });
    

    【讨论】:

    • 感谢分享答案,但是...请问 Q 是什么? :)
    • 一个用 JavaScript 编写和编写异步 promise 的工具 documentup.com/kriskowal/q
    • 您需要在您的应用程序存储库中使用“npm install q --save-dev”安装 q
    • 如果可以避免就不要使用Q,它很慢并且消耗大量内存。考虑改用蓝鸟。
    【解决方案3】:

    npm Q 是第一件事,然后在你的脚本之上使用 requirejs

          var Q = require('q');
    
          element.all(by.repeater('object in objects')).then(function (arr) {
              var promises = [];
              for (var i = 0; i < arr.length; i++) {
                  promises.push(arr[i].getText());
              }
    
              Q.all(promises).done(function (result) {
                  // print the results when the lookups and processing are done
                  console.log(result.length);
                  console.log(result);
              });
          });
    

    顺便说一句,我认为我的第二个选择更干净。

    【讨论】:

      最近更新 更多