2017-08-31 78 views
-1

我很高兴有什么async.js可以做,但它似乎缺少一两件事,我需要马上做:async.js:迭代集合,直到一个返回true

我有包含数据的数组。

[{"name": "bob", "age":15}, 
{"name": "bill", "age":19}, 
{"name": "john", "age": 24}] 

我要呼叫的相同函数阵列[I]作为参数,直到它为的数组的内容一个返回true。 (在这个例子中,可能会将用户写入数据库,直到其中一个人至少有特定年龄,否则返回错误)。 这样: 尝试鲍勃 - >错误 然后尝试比尔 - >成功 - >然后继续下一个任务,并勿

的一切,我发现去要求的功能(没有数据)数组或没有按似乎并不知道这个想法,“尝试直到找到一个匹配的”。

或者也许我没有读到docs够好吗? 我该怎么做?谢谢

+4

为什么你甚至可以使用'async'是什么?遍历数组,直到某些条件为真只需要基本的循环逻辑,但很确定异步甚至会输入图片的方式或原因。你可以发布迄今为止尝试过的完整代码吗?还是[mcve]? –

+0

,因为我想在每次迭代时调用一个服务器。我注意到一个正常的for循环只是继续而不是等待第一个成功。所以我认为异步可能能够排队的呼叫,并继续成功的另一个功能 – devman

+1

https://caolan.github.io/async/docs.html#some 返回true,如果至少有一个元素在科尔满足异步测试。如果任何迭代器调用返回true,则立即调用主回调函数。 – alechill

回答

0

这很容易与普通的js。只是包装一个承诺内的递归迭代:

var some = new Promise(res => { 
    const arr = [{"name": "bob", "age":15}, {"name": "bill", "age":19},{"name": "john", "age": 24}]; 
    (function next(i){ 
    if(i>=arr.length) return res(false); 
    someasync(arr[i]).then(result => { 
     if(result){ 
     res(true); 
     }else{ 
     next(i+1); 
     } 
    }); 
    })(0); 
}); 

在ESnext同样的事情:

async function some(func, params){ 
for(var i = 0; i < params.length; i++){ 
    if(await func(params[i])){ 
    return true; 
    } 
} 
return false; 
} 

some(a=>a%2==0, [0,1,2,3,4]).then(alert); 
+0

mhhh对不起,这不是我所说的“很容易” 。虽然它可以工作,但是如果这是开销,我想避免 – devman

+0

@devman的很多开销,为什么要嵌入整个库:/?如“字符开销”一样,开销为 –

+0

。我宁愿有一个图书馆,写2行,比没有图书馆和写10行 – devman