在数组javascript的sort函数中实现async/await

qui*_*mmo 6 javascript sorting promise async-await protractor

我正在尝试在量角器上实现排序方法ElementArrayFinder.众所周知,所有量角器方法都会返回承诺.所以我的排序方法有一个依赖于promises解决方案的条件.我正在使用节点插件,async/await以使其与低于6的node.js版本兼容.(这里的插件:https://www.npmjs.com/package/asyncawait)

在这里我的代码,其中thisArrayElementFinder:

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).知道我做错了什么吗?任何想法如何实现我的目标?

非常感谢您的帮助

Ber*_*rgi 7

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)