【问题标题】:Return array after resolve promise解决承诺后返回数组
【发布时间】:2018-10-29 16:35:41
【问题描述】:

我正在尝试解决我的问题,但我没有任何想法。 我想创建函数来根据类型变量返回值数组。

我想检查发送给函数的参数是字符串数组还是webelements数组,我想将此数组返回给其他函数进行排序。

这是我的代码:

  private static returnByType(unSortedElements) {
      var i = 0;
      var unSorted = [];
      if (typeof unSortedElements[0] === 'string') {
          unSorted = unSortedElements;
          return unSorted;
      } else {
          return unSortedElements.each((eachName) => {
              eachName.getText().then((name) => {
                  unSorted[i] = name;
                  i++;
              })
          })

      }

  }

如果我将字符串数组传递给这个函数,它会返回带有这个字符串的数组,但是当我传递一个 webelements 列表时,我得到一个空数组(在 else 块中)。 我应该如何从 else 块返回 unSorted?

【问题讨论】:

  • 首先,不能同步返回异步函数调用的结果。如果您在函数中进行异步函数调用,则还需要在调用者中异步等待。但是由于让函数返回同步或异步结果是很疯狂的,因此您应该将其标准化为始终返回异步结果,即使对于字符串情况也是如此。

标签: javascript typescript promise protractor automated-tests


【解决方案1】:

如果你在处理promise,你不能只返回值,它永远是一个promise。你的代码应该是这样的:

private static returnByType(unSortedElements) {
  var i = 0;
  var unSorted = [];
  if (typeof unSortedElements[0] === 'string') {
      unSorted = unSortedElements;
      // Promise.resolve(unSorted) to unify with else
      return Promise.resolve(unSorted);
  } else {
      // return type will be Promise<[]>
      return Promise.all(unSortedElements.map((eachName) => eachName.getText()));
  }

}

函数的返回类型现在将是Promise&lt;[]&gt;。然后你可以像这样使用它:

returnByType(args).then((unsorted) => ...);

【讨论】:

  • 绝对同意在两个分支中返回一个promise来简化函数调用
  • 谢谢!看起来很简单:) 但是我有一个问题,当我传递 webelements ($$) 列表并尝试在其他:this.returnByType(unSortedElements).then((unsorted) =&gt; { console.log(unsorted) }); 中使用此功能时,在控制台中我收到错误nhandledPromiseRejectionWarning: TypeError: undefined is not a function at Function.all (&lt;anonymous&gt;) at Function.returnByType (/home/kamil/projects/automation-tests/tmp/utils/Sort.js:18:28
  • 那个错误并没有说明什么。您必须显示unSortedElements 的类型和来源。如果unSortedElements 是一些对象的数组,其getText() 返回一个promise,则答案中的代码将起作用。
  • unSortedElements 是页面上部分的标题列表,我通过unSortedElements = $$('.adm-chart .card-title')得到它
  • 正如我之前所说,一次到这个函数returnByType 将传递带有文本的数组,其他时间将传递webelements 列表。 Te 排序函数将使用这个来排序返回的值而不是它的类型(文本数组或 webelement 数组)
猜你喜欢
  • 2016-08-19
  • 2022-01-18
  • 2019-10-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2018-03-15
相关资源
最近更新 更多