javascript-条件为Promise.all
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-条件为Promise.all,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2628字,纯文字阅读大概需要4分钟。
内容图文
![javascript-条件为Promise.all](/upload/InfoBanner/zyjiaocheng/664/eb736757ae024e2193d15a966674fcd9.jpg)
这个问题已经在这里有了答案: > Wait until all ES6 promises complete, even rejected promises 16个
我知道this answer,以下代码基于该代码.它正在工作,但是我对某些事情不满意.
如果我想进行一些条件检查并据此解决怎么办?我在要更改的代码上发表了评论.
/**
* Returns not yet propagate subdomains.
* @return Promise
*/
Tour.prototype.getOffline = function() {
var self = this;
var resolve_, reject_;
// to be fulfilled later
var promise = new Promise(function(resolve, reject){
resolve_ = resolve;
reject_ = reject;
});
var check = function(key) {
return new Promise(function(resolve, reject) {
redis_client.hmget(key, 'online', function(err, reply) {
if (reply[0] === 'n') {
resolve(key); // <----- I'd like to resolve only here
} else {
// reject(); // <---- I can't reject cause of Promise.all
resolve(); // <----- An empty value to satisfy Promise.all
}
});
});
};
this.getKeysRedis('subdomain:*').then(function(resp) {
var promises = resp.map(check);
var results = Promise.all(promises);
results.then(function(data) {
// I have undefined values on data array
var array = data.filter(function(key){
return utils.isDefAndNotNull(key);
});
resolve_(array); // <------ How can I resolve without filtering
});
}, function(error) {
reject_(error);
});
return promise;
};
最终代码,在@Bergi警告时删除了Promise构造函数反模式:
Tour.prototype.getOffline = function() {
var self = this;
var check = function(key) {
return new Promise(function(resolve, reject) {
redis_client.hmget(key, 'online', function(err, reply) {
if (reply[0] === 'n') resolve(key);
else reject();
});
});
};
var reflect = function(promise) {
return promise.then(
x => ({state: 'resolved', value: x}),
e => ({state: 'rejected' , value: e})
);
};
return new Promise(function(resolve, reject) {
self.getKeysRedis(self.subdomain_keyname + '*')
.then(function(keys) {
return Promise.all(keys.map(check).map(reflect)).then(function(r) {
return r.filter(x => x.state === 'resolved');
});
})
.then(function(results) {
var array = results.map((result) => result.value);
resolve(array);
})
.catch((err) => reject(err));
});
};
解决方法:
您基本上想要一个函数,该函数接受一个Promise并返回一个Promise,每当另一个Promise解析(实现或拒绝)时,Promise就会实现:
该功能通常称为“反射”:
function reflect(promise){
return promise.then(x => ({state: "fulfilled", value: x}),
e => ({state: "rejected" , value: e}));
}
这意味着您可以拒绝(就像通常那样)然后执行以下操作:
this.getKeysRedis('subdomain:*').then(resp =>
resp.map(check).map(reflect); // note the reflect
).then(Promise.all).then(results => {
// access results here
results[0].state; // "fulfilled" if it fulfilled
results[0].value; // the value or error
});
内容总结
以上是互联网集市为您收集整理的javascript-条件为Promise.all全部内容,希望文章能够帮你解决javascript-条件为Promise.all所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。