使用 BlueBird + React Native 过滤未定义的承诺
Filtering undefined promises with BlueBird + React Native
我正在尝试获取多个 rss 提要,获取它们的每个承诺,并使用 bluebird 合并每个返回的承诺的数组,以获得用户相关内容的数组。
但是,有时某些 rss 提要已关闭或没有图像,这些承诺会返回一个未定义的数组,数组应如下所示:
所以我正在寻找一种方法来过滤掉这些不好的承诺并保留好的承诺。我对蓝鸟和一般的承诺非常陌生,非常感谢任何帮助。现在这是我的代码(根本不会过滤掉任何承诺,但会合并它们的数组):
//combining promises
var that = this;
return Promise.all(rss_feeds)
.then((res) => {
for (var q = 0; q < res.length; q++)
{
for (var a =0; a < res[q].length; a++)
{
final_array.push(res[q][a]);
}
}
//console.log('The following array of objects was constructed and is now being shuffled');
//console.log(final_array.length);
that.shuffle(final_array);
//console.log(final_array);
return final_array;
});
一旦值被包装在 Promise
中,检查它的唯一方法是使用 .then
方法。事实上,promise 之所以如此强大,是因为 .then
允许在不关心其实际存在的情况下操纵包装值。换句话说,promises 表示最终值的计算上下文。
因此,您首先需要从承诺数组转移到具有 Promise#all
的数组承诺,然后对最终的值数组进行推理(其中一些可能是 undefined
).之后,您可以过滤 return 一个仅包含所需值的新承诺。
这导致:
// dummy values to simulate the use case
var arrayOfPromises = [Promise.resolve(1), Promise.resolve(undefined), Promise.resolve(2)]
var result = Promise.all(arrayOfPromises).then(ps => ps.filter(p => p));
result.then(console.log.bind(console)); // output: [1, 2]
请注意,Bluebird 提供了一个额外的 Promise#filter
方法作为 shorthand。但是,上面的代码具有使用 bluebird 和原生 ES6 promises 的优点。
我正在尝试获取多个 rss 提要,获取它们的每个承诺,并使用 bluebird 合并每个返回的承诺的数组,以获得用户相关内容的数组。
但是,有时某些 rss 提要已关闭或没有图像,这些承诺会返回一个未定义的数组,数组应如下所示:
所以我正在寻找一种方法来过滤掉这些不好的承诺并保留好的承诺。我对蓝鸟和一般的承诺非常陌生,非常感谢任何帮助。现在这是我的代码(根本不会过滤掉任何承诺,但会合并它们的数组):
//combining promises
var that = this;
return Promise.all(rss_feeds)
.then((res) => {
for (var q = 0; q < res.length; q++)
{
for (var a =0; a < res[q].length; a++)
{
final_array.push(res[q][a]);
}
}
//console.log('The following array of objects was constructed and is now being shuffled');
//console.log(final_array.length);
that.shuffle(final_array);
//console.log(final_array);
return final_array;
});
一旦值被包装在 Promise
中,检查它的唯一方法是使用 .then
方法。事实上,promise 之所以如此强大,是因为 .then
允许在不关心其实际存在的情况下操纵包装值。换句话说,promises 表示最终值的计算上下文。
因此,您首先需要从承诺数组转移到具有 Promise#all
的数组承诺,然后对最终的值数组进行推理(其中一些可能是 undefined
).之后,您可以过滤 return 一个仅包含所需值的新承诺。
这导致:
// dummy values to simulate the use case
var arrayOfPromises = [Promise.resolve(1), Promise.resolve(undefined), Promise.resolve(2)]
var result = Promise.all(arrayOfPromises).then(ps => ps.filter(p => p));
result.then(console.log.bind(console)); // output: [1, 2]
请注意,Bluebird 提供了一个额外的 Promise#filter
方法作为 shorthand。但是,上面的代码具有使用 bluebird 和原生 ES6 promises 的优点。