qui*_*mmo 6 javascript sorting promise async-await protractor
我正在尝试在量角器上实现排序方法ElementArrayFinder.众所周知,所有量角器方法都会返回承诺.所以我的排序方法有一个依赖于promises解决方案的条件.我正在使用节点插件,async/await以使其与低于6的node.js版本兼容.(这里的插件:https://www.npmjs.com/package/asyncawait)
在这里我的代码,其中this是ArrayElementFinder:
var asyncCompare = async(function(a, b) {
let x = await (a.getText());
let y = await (b.getText());
console.log(x.localeCompare(y));
return x.localeCompare(y);
});
var sortTheArray = async(function(arrayOfElementFinders) {
return await (arrayOfElementFinders.sort(asyncCompare));
});
this.then((elements) => {
let arrayOfElementFinders = [elements[0], elements[1], elements[2]];
let sortedArray = sortTheArray(arrayOfElementFinders);
console.log('array sorted');
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,时序执行不是我期望的.印刷:array sorted发生在比之前的印刷品上x.localeCompare(y).知道我做错了什么吗?任何想法如何实现我的目标?
非常感谢您的帮助
sort不进行异步回调.它期望一个数值作为返回值,而不是一个承诺; 它确实返回一个数组而不是一个承诺.没有办法解决这个问题(尽管可以实现自定义异步排序算法 - 甚至是并行算法).
但无论如何,这都是非常低效的.在每个排序步骤中异步获取比较值将会很慢 - 并且它将多次获取每个元素的相同值.不要那样做.相反,使用Schwartzian变换来获取值以进行排序,然后排序(同步),然后使用结果.
你应该做
const elements = await this;
const arrayOfElementFinders = elements.slice(0, 3); // or Array.from?
const comparableArray = await Promise.all(arrayOfElementFinders.map(async x => [await x.getText(), x]));
comparableArray.sort((a, b) => +(a[0] > b[0]) || -(a[0] < b[0]));
const sortedArray = comparableArray.map(x => x[1]);
console.log('array sorted');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |