2017-07-19 60 views
0

以下:Array.find和本地asyncawait /异步/ asyncawait /等待解决方案

h = hs.find(h => await(isAvail(h))); 

采用以下库:

const async = require('asyncawait/async'); // async is used in the isAvail function to wrap it 
const await = require('asyncawait/await'); 

我似乎无法找到这样做的优雅的方式没有一个老学校的循环阵列。问题在于,如果发现对阵列的迭代等待似乎阻止它。这不会发生在本地等待中,因为await要求将该函数声明为async,它本身会返回一个必须等​​待的Promise,因此第四个。

任何人有任何想法?

+0

你能尝试澄清你想要达到的目标,而不仅仅是说明你认为问题是什么? –

+0

@ E.Sundin嗨!我想删除第三方库。在元素作为参数发送给异步函数(isAvail)后,遍历数组并返回与“true”匹配的第一个元素。我想跳过遍历整个数组。 –

+0

如果你运行它异步然后什么是'第一个元素'的概念是相当模糊的。 –

回答

0

你试过:

h = hs.find(async h => await(isAvail(h))); 
+0

的确,我在这个问题上写了关于这个问题的文章。 Find期望返回true/false布尔值。异步函数返回既不是的Promise。 –

+0

哦,我现在明白了这个问题。这很奇怪,它应该只传递布尔值。我会做一些测试,看看能否找到任何东西。 – ThomasK

+0

异步函数永远不会返回一个布尔值或其他不是承诺的东西。 – MySidesTheyAreGone

0

你需要一个for循环地方

下面是一个使用asyncawait库的解决方案:

const async = require('asyncawait').async; 
const await = require('asyncawait').await; 

const find = async(function (arr, predicate) { 
    let check = false, result = null; 
    for (let elm of arr) { 
    check = await(predicate(elm)); 
    if (check) { 
     result = elm; 
     break; 
    } 
    } 
    return result; 
}); 

function isItBig (n) { 
    return Promise.resolve(n > 3); 
} 

let test = [1, 2, 3, 4, 5]; 

find(test, isItBig).then(console.log); //prints 4 

这是使用原生异步几乎相同的解决方案/伺机包含在最新版本的Node.js的:

async function find (arr, predicate) { 
    let check = false, result = null; 
    for (let elm of arr) { 
    check = await predicate(elm); 
    if (check) { 
     result = elm; 
     break; 
    } 
    } 
    return result; 
} 

async function isItBig (n) { 
    return n > 3; 
} 

let test = [1, 2, 3, 4, 5]; 

find(test, isItBig).then(console.log); //prints 4 
+0

对不起,我很困惑>。< 现在应该可以。 – MySidesTheyAreGone