返回第一个满足条件的数组中的值

时间:2020-10-29 14:55:08

标签: node.js

对不起,node.js的新手

我想从首先满足条件的数组中返回一个值。请参见下面的最小示例:

var urlExists = require('url-exists');
arr = ['http://123123123.com/', 'https://www.google.com/', 'https://www.yahoo.com/']
const found = arr.find(url => urlExists(url, function(err, exists) { return exists } ));
// expecting google.com

不确定如何使urlExists(...)评估为true

1 个答案:

答案 0 :(得分:2)

您可以在此处使用Promises。首先,您可以将.map()的URL数组转换为一个Promises数组,这些Promises数组是根据给定URL是否调用urlExists错误而拒绝还是解决。

一旦有了一个诺言数组,就可以将其传递给对Promise.all()的调用,这将返回一个新的诺言。此承诺解决后,它将包含一个[[url1, existsStatus1], ...]形式的数组,然后您可以使用.find()来查找existsStatus为true的第一个匹配项:

const urlExists = require('url-exists');
const arr = ['http://123123123.com/', 'https://www.google.com/', 'https://www.yahoo.com/'];

const urlPromise = Promise.all(arr.map(
  url => new Promise((res, rej) => urlExists(url, (err, exists) => err ? rej(err) : res([url, exists])))
));
urlPromise.then((arr) => {
  const [found] = arr.find(([,exists]) => exists) || [];
  console.log(found); // URL found, undefined if nothing found
}).catch((err) => { // error with handling one of the URLs 
  console.error(err);
});