在数组javascript的排序函数中实现异步/等待

在数组javascript的排序函数中实现异步/等待,javascript,sorting,promise,async-await,protractor,Javascript,Sorting,Promise,Async Await,Protractor,我正在尝试在量角器ElementArrayFinder上实现一种排序方法。众所周知,所有量角器方法都返回承诺。 所以我的排序方法有一个条件,它取决于分辨率。 我正在为async/await使用一个节点插件,以使其与低于6的node.js版本兼容。 (这里是插件:) 这里是我的代码,其中此是ArrayElementFinder: var asyncCompare = async(function(a, b) { let x = await (a.getText()); let y

我正在尝试在量角器
ElementArrayFinder
上实现一种排序方法。众所周知,所有量角器方法都返回承诺。 所以我的排序方法有一个条件,它取决于分辨率。 我正在为
async/await
使用一个节点插件,以使其与低于6的node.js版本兼容。 (这里是插件:)

这里是我的代码,其中
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');
});
不幸的是,计时执行不是我所期望的。打印:
数组排序
比比较
x.localeCompare(y)
的打印早。 知道我做错了什么吗?你知道如何实现我的目标吗

非常感谢您的帮助

不接受异步回调。它期望一个数值作为返回值,而不是一个承诺;它确实返回一个数组,而不是一个承诺。没有办法解决这个问题(尽管可以实现自定义异步排序算法——甚至是并行排序算法)

但这是相当低效的。在每个排序步骤中异步获取比较值会很慢,而且它会多次获取每个元素的相同值。不要那样做。相反,使用获取要排序的值,然后进行排序(同步),然后使用结果

你应该这样做

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');
const elements=等待此消息;
const arrayOfElementFinders=元素。切片(0,3);//还是从?
const comparableArray=await Promise.all(arrayOfElementFinders.map(异步x=>[await x.getText(),x]);
比较数组排序((a,b)=>+(a[0]>b[0])| |-(a[0]x[1]);
log('array sorted');
不接受异步回调。它期望一个数值作为返回值,而不是一个承诺;它确实返回一个数组,而不是一个承诺。没有办法解决这个问题(尽管可以实现自定义异步排序算法——甚至是并行排序算法)

但这是相当低效的。在每个排序步骤中异步获取比较值会很慢,而且它会多次获取每个元素的相同值。不要那样做。相反,使用获取要排序的值,然后进行排序(同步),然后使用结果

你应该这样做

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');
const elements=等待此消息;
const arrayOfElementFinders=元素。切片(0,3);//还是从?
const comparableArray=await Promise.all(arrayOfElementFinders.map(异步x=>[await x.getText(),x]);
比较数组排序((a,b)=>+(a[0]>b[0])| |-(a[0]x[1]);
log('array sorted');

它不支持V6之前的承诺吗

我不喜欢将命令式
wait
与函数式
promise
抽象混为一谈。难道你不能像我一样做吗

Promise.all([Promise.resolve(10)、Promise.resolve(4)、Promise.resolve(7)])
.然后(r=>r.sort((a,b)=>a-b))

。然后(s=>console.log)它不支持V6之前的承诺吗

我不喜欢将命令式
wait
与函数式
promise
抽象混为一谈。难道你不能像我一样做吗

Promise.all([Promise.resolve(10)、Promise.resolve(4)、Promise.resolve(7)])
.然后(r=>r.sort((a,b)=>a-b))

。然后(s=>console.log)Array.prototype.sort是一个同步函数。Array.prototype.sort是一个同步函数。感谢您的回复。因此,实际上你的建议是使用异步代码(例如通过Promissions)手动检索我的比较值,然后使用一个同步排序函数返回我以前计算的这些值?@Qurimmo是的,正是这样。非常感谢你的提示和回答,非常好,非常有用。不幸的是,我不能让它工作。两个主要问题:1)目前我从上面的代码中得到了3个未定义的代码:
[未定义,未定义,未定义]
。2) 我想去掉
async/await
,只使用promissions,也许我用于实现的第三方库也是第一个问题的原因。有什么想法吗?再次感谢。这就是我到目前为止所做的,用承诺来改变它。很抱歉,格式不好,但这里的评论太糟糕了<代码>this.then((elements)=>{const arrayOfElementFinders=elements.slice(0,3);//或Array.from?const comparableArray=Promise.all(arrayOfElementFinders.map(async((x)=>[await(x.getText(),x)]);comparableArray.then((arr)=>{arr.sort((a,b)=>+(a[0]>b[0]);const sortedArray=arr.map(x=>x[1]);console.log(sortedArray);};})
未定义的
在哪里发生,在
数组felementfinders
中(可能是我的
slice()
调用不起作用),或者
比较数组
或者在
sortedArray
中?关于
async
/
wait
,您当然可以使用
then()
回调来替换它们,但我看不出有任何理由在它们可用时这样做。谢谢您的回复。因此,实际上你的建议是使用异步代码(例如通过Promissions)手动检索我的比较值,然后使用一个同步排序函数返回我以前计算的这些值?@Qurimmo是的,正是这样。非常感谢你的提示和回答,非常好,非常有用。不幸的是,我不能让它工作。两个主要问题:1)目前我从上面的代码中得到了3个未定义的代码:
[未定义,未定义,未定义]
。2) 我想去掉
async/await
,只使用promissions,也许我用于实现的第三方库也是第一个问题的原因。有什么想法吗?再次感谢。这就是我到目前为止所做的,用承诺来改变它。