javascript在数组排序功能中实现异步/等待 [英] Implement async/await in sort function of arrays javascript

查看:56
本文介绍了javascript在数组排序功能中实现异步/等待的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

var asyncCompare = async(function(a, b) {让 x = 等待 (a.getText());让 y = 等待 (b.getText());console.log(x.localeCompare(y));返回 x.localeCompare(y);});var sortTheArray = async(function(arrayOfElementFinders) {返回等待(arrayOfElementFinders.sort(asyncCompare));});this.then((元素) => {让 arrayOfElementFinders = [元素[0],元素[1],元素[2]];让 sortedArray = sortTheArray(arrayOfElementFinders);console.log('数组排序');});

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

非常感谢您的帮助

解决方案

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

但无论如何这效率很低.在每个排序步骤中异步获取比较值会很慢 - 它会多次获取每个元素的相同值.不要那样做.相反,使用 Schwartzian 变换 来获取要排序的值,然后排序(同步),然后使用结果.

你应该这样做

const 元素 = 等待这个;const arrayOfElementFinders = elements.slice(0, 3);//还是 Array.from?const compareArray = await Promise.all(arrayOfElementFinders.map(async x => [await x.getText(), x]));compareArray.sort((a, b) => +(a[0] > b[0]) || -(a[0]  x[1]);console.log('数组排序');

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆