問題描述
我正在嘗試在量角器 ElementArrayFinder
上實現排序方法.眾所周知,所有量角器方法都返回承諾.所以我的排序方法有一個取決于承諾解決的條件.我正在為 async/await
使用節點插件,以使其與低于 6 的 node.js 版本兼容.(這里的插件:https://www.npmjs.com/package/asyncawait)p>
這是我的代碼,其中 this
是 ArrayElementFinder
:
var asyncCompare = async(function(a, b) {讓 x = 等待 (a.getText());讓 y = 等待 (b.getText());控制臺.log(x.localeCompare(y));返回 x.localeCompare(y);});var sortTheArray = async(函數(arrayOfElementFinders){返回等待(arrayOfElementFinders.sort(asyncCompare));});this.then((元素) => {讓arrayOfElementFinders = [元素[0],元素[1],元素[2]];讓 sortedArray = sortTheArray(arrayOfElementFinders);console.log('數組排序');});
不幸的是,時間執行不是我所期望的.print: array sorted
發生在比較 x.localeCompare(y)
之前.知道我在做什么錯嗎?知道如何實現我的目標嗎?
非常感謝您的幫助
sort
不采用異步回調.它期望一個數值作為返回值,而不是一個承諾;它確實返回一個數組而不是一個承諾.沒有辦法解決這個問題(盡管可以實現自定義的異步排序算法——甚至是并行算法).
但這無論如何都是非常低效的.在每個排序步驟中異步獲取比較值會很慢 - 它會多次獲取每個元素的相同值.不要那樣做.相反,使用 Schwartzian 變換 來獲取要排序的值,然后排序(同步),然后使用結果.
你應該這樣做
const 元素 = 等待這個;const arrayOfElementFinders = elements.slice(0, 3);//還是 Array.from?常量可比較數組 = await Promise.all(arrayOfElementFinders.map(async x => [await x.getText(), x]));compareArray.sort((a, b) => +(a[0] > b[0]) || -(a[0] < b[0]));const sortedArray = compatibleArray.map(x => 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的排序函數中實現async/await的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!