![](/img/trans.png)
[英]Node.js Async await control flow break down call function in setTimeout
[英]Node.js control flow with if and async call
我正在將rails代碼移植到node.js並遇到控制流問題。 移植以下代碼的最佳方法是什么:
filter = {blah:blah};
result = {};
if(filters.something) {
asyncDBCall(function(){
result.something = somevalue;
});
}
if(filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = someothervalue;
});
}
return result;
節點JS的主要優缺點是執行功能時具有異步特性。 您的代碼應為
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
return result;
});
}
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
return result;
});
}
但是,如果這兩個條件都可能成立,則是可能的。 在這種情況下,您必須等待另一個asyncDBCall完成之后再進行下一個asyncDBCall。 該代碼將是
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
return result;
});
}
});
}
還有另一種解決方案,允許同時發送兩個請求。
var someFlag = false, someOtherFlag = false;
if (filters.something) {
asyncDBCall(function() {
result.something = somevalue;
someFlag = true;
if (someFlag && someOtherFlag)
return result;
});
}
if (filters.someOtherThing) {
asyncDBCall(function() {
result.someOtherThing = somevalue;
someOtherFlag = true;
if (someFlag && someOtherFlag)
return result;
});
}
如果過濾器對象中有許多屬性,則需要使用遞歸。
使用異步模塊。 Async.parallel將並行執行兩個查詢。 使用async.series一個接一個地執行。
您應該考慮使用JavaScript Promise。 使用它們時,您不必處理node.js將您帶入的回調地獄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.