Javascript 以承诺为条件
我知道,下面的代码就是基于它编写的。这是工作,但我不满意的东西 如果我想进行一些条件检查并基于它进行解析,该怎么办?我已经评论了我想更改的代码Javascript 以承诺为条件,javascript,node.js,promise,Javascript,Node.js,Promise,我知道,下面的代码就是基于它编写的。这是工作,但我不满意的东西 如果我想进行一些条件检查并基于它进行解析,该怎么办?我已经评论了我想更改的代码 /** * Returns not yet propagate subdomains. * @return Promise */ Tour.prototype.getOffline = function() { var self = this; var resolve_, reject_; // to be fulfilled late
/**
* 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;
};
基本上,您需要一个函数,该函数接受一个承诺并返回一个承诺,该承诺在另一个承诺解析(满足或拒绝)时满足: 该函数通常称为“反射”: 这意味着您可以拒绝(像通常一样),然后执行以下操作:
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
});
所以,当所有的承诺都达成时,你想基本上采取行动,不管承诺是否兑现或解决?(如果没有,请包括你想做的事情,你的目标是什么?)我想我没有理解你的问题。避免!这个
(x=>({state:“completed”,value:x})
是如何用javascript编写的?谢谢你的回答。@JonatasWalker-uhh…那是javascript。它运行在我假设你正在使用的节点上-它是短(箭头)函数语法。你可以用函数(x){return state:completed,value:x}替换它
在这种情况下,它应该可以工作。
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
});