gpt4 book ai didi

javascript - 在数组javascript的排序功能中实现异步/等待

转载 作者:数据小太阳 更新时间:2023-10-29 06:09:48 35 4
gpt4 key购买 nike

我正在尝试在 Protractor ElementArrayFinder 上实现排序方法。众所周知,所有 Protractor 方法都返回 promise 。所以我的排序方法有一个条件取决于 promise 的解决。我正在为 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');
});

不幸的是,计时执行不是我所期望的。 print: array sorted 发生在比较 x.localeCompare(y) 的打印之前。知道我做错了什么吗?知道如何实现我的目标吗?

非常感谢您的帮助

最佳答案

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

但这无论如何都非常低效。在每个排序步骤中异步获取比较值会很慢 - 并且它会多次获取每个元素的相同值。不要那样做。相反,使用 Schwartzian transform获取之前要排序的值,然后排序(同步),然后使用结果。

你应该这样做

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 - 在数组javascript的排序功能中实现异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45661247/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com