在数组javascript的排序功能中实现异步/等待 [英] Implement async/await in sort function of arrays javascript
问题描述
我正在尝试对量角器ElementArrayFinder
实施排序方法.众所周知,所有量角器方法都返回承诺.
所以我的排序方法有一个条件取决于promise解析.
我正在为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');
});
不幸的是,计时执行不是我期望的.打印: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');
I am trying to implement a sort method on protractor ElementArrayFinder
. As known, all protractor methods return promises.
So my sort method has a condition which depends on promises resolution.
I am using a node plugin for async/await
in order to make it compatible with node.js versions lower than 6.
(Here the plugin: https://www.npmjs.com/package/asyncawait)
Here my code, where this
is the 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');
});
Unfortunately the timing execution is not the one I expect. The print: array sorted
happens before than the prints of comparing x.localeCompare(y)
.
Any idea what am I doing wrong? And any idea how to achieve my objective?
Thanks a lot for any help
sort
does not take an asynchronous callback. It expects a numeric value as the return value, not a promise for one; and it does return an array not a promise. There's no way around this (though one could implement a custom asynchronous sorting algorithm - even a parallel one).
But that's pretty inefficient anyway. Doing asynchronous fetching of compare values in every sort step will be slow - and it will fetch the same value per element multiple times. Don't do that. Instead, use a Schwartzian transform to fetch the values to sort by before, then sort (synchronously), then use the results.
You should do
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');
这篇关于在数组javascript的排序功能中实现异步/等待的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!