防止 promise 链进入下一步
Prevent promise chain to go next step
首先我想问一下这是否是一个很好的处理 promises 的解决方案。
app.get('/sample', function(req, res) {
var promiseFlow = {
step1: function() {
return modelPromise1();
},
step2: function(result) {
if(result) {
// I would like to stop the promise chain here
res.send(result);
} else {
return modelPromise2();
}
},
step3: function(result) {
if(result) {
res.send(result);
} else {
// This will be sent always
res.send(false);
}
}
}
promiseFlow.step1()
.then(promiseFlow.step2)
.then(promiseFlow.step3)
.catch(function(error) {
console.log(error);
});
});
用户模型示例:
_self.get_user_info = function(_guid) {
var deferred = modules.Q.defer();
modules.system.db.connect(deferred, function(connection) {
var query = modules.qb.select().from('users')
.field('_guid')
.field('username')
.where('_guid = ?', _guid);
connection.query(query.toString(), function(error, result) {
connection.release();
if(error) {
deferred.reject(error);
return;
}
if(result.length) {
deferred.resolve(result);
} else {
deferred.reject(null);
}
});
});
return deferred.promise;
}
我的主要问题是我不知道如何打破这个链条而不是
执行下一步。 res.send(false) 无论如何都会在步骤 3 中发生。
这个东西可以用吗,或者我应该为此选择其他模式。
谢谢!
这确实没有什么不同,但会使代码复杂化。
试试这个:
modelPromise1()
.then(function(result) {
if (!result) return modelPromise2();
}).then(function(result) {
if (!result) res.send(false);
else res.send(result);
}).catch(/*...*/);
我认为问题在于你是从另一个角度来处理它的。
承诺应在成功时履行,并在错误时拒绝。
then
方法有两个参数:第一个是处理成功,第二个是处理拒绝。在拒绝时,控制流跳转到下一个拒绝处理程序 - 在实现时,它只是转到下一个实现处理程序。通常我更喜欢这个而不是catch
,因为它更清楚地表明了谁的错误被处理了。
您似乎在尝试将成功(当您发送响应时)处理为错误,反之亦然。
你应该在错误而不是成功时打破链条。
此外,您的承诺应该在错误时被拒绝(例如,在失败时抛出异常,或拒绝承诺)而不是不返回结果。
你需要这样的东西:
promise1()
.then(function(result) {
res.send(result);
}, function(error) {
return promise2()
.then(function(result) {
res.send(result);
}, function(result) {
res.send(false);
});
});
首先我想问一下这是否是一个很好的处理 promises 的解决方案。
app.get('/sample', function(req, res) {
var promiseFlow = {
step1: function() {
return modelPromise1();
},
step2: function(result) {
if(result) {
// I would like to stop the promise chain here
res.send(result);
} else {
return modelPromise2();
}
},
step3: function(result) {
if(result) {
res.send(result);
} else {
// This will be sent always
res.send(false);
}
}
}
promiseFlow.step1()
.then(promiseFlow.step2)
.then(promiseFlow.step3)
.catch(function(error) {
console.log(error);
});
});
用户模型示例:
_self.get_user_info = function(_guid) {
var deferred = modules.Q.defer();
modules.system.db.connect(deferred, function(connection) {
var query = modules.qb.select().from('users')
.field('_guid')
.field('username')
.where('_guid = ?', _guid);
connection.query(query.toString(), function(error, result) {
connection.release();
if(error) {
deferred.reject(error);
return;
}
if(result.length) {
deferred.resolve(result);
} else {
deferred.reject(null);
}
});
});
return deferred.promise;
}
我的主要问题是我不知道如何打破这个链条而不是 执行下一步。 res.send(false) 无论如何都会在步骤 3 中发生。 这个东西可以用吗,或者我应该为此选择其他模式。
谢谢!
这确实没有什么不同,但会使代码复杂化。
试试这个:
modelPromise1()
.then(function(result) {
if (!result) return modelPromise2();
}).then(function(result) {
if (!result) res.send(false);
else res.send(result);
}).catch(/*...*/);
我认为问题在于你是从另一个角度来处理它的。 承诺应在成功时履行,并在错误时拒绝。
then
方法有两个参数:第一个是处理成功,第二个是处理拒绝。在拒绝时,控制流跳转到下一个拒绝处理程序 - 在实现时,它只是转到下一个实现处理程序。通常我更喜欢这个而不是catch
,因为它更清楚地表明了谁的错误被处理了。
您似乎在尝试将成功(当您发送响应时)处理为错误,反之亦然。 你应该在错误而不是成功时打破链条。
此外,您的承诺应该在错误时被拒绝(例如,在失败时抛出异常,或拒绝承诺)而不是不返回结果。
你需要这样的东西:
promise1()
.then(function(result) {
res.send(result);
}, function(error) {
return promise2()
.then(function(result) {
res.send(result);
}, function(result) {
res.send(false);
});
});