Array.find和native asyncawait / async / asyncawait / await解决方案

时间:2017-07-19 13:41:57

标签: javascript

以下内容:

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');

如果没有旧学校的循环数组,我似乎无法找到一种优雅的方式。问题是当find迭代数组时await似乎阻止了它。本机等待不会发生这种情况,因为await需要将该函数声明为async,它本身返回一个必须等​​待的Promise,然后是第四个。

有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

你试过了吗?

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

答案 1 :(得分: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 / await:

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