2015-09-06 89 views
0

我有返回promise的函數列表。我希望它們按順序運行,直到其中至少有一個解決。如果其中一個解決了所有其他問題不應執行。從列表中順序運行函數,直到解析爲止

的算法應該是以下幾點:

運行第一個功能,如果它解決了與返回值退出,否則運行第二個功能,如果它解決了與返回值等退出。

是否有可能通過承諾來實現?我正在使用藍鳥圖書館。

期望中的僞代碼

.run(getUserFromFileById(id)) 
.run(getUserFromFileByEmail(email)) 
.run(getUserFromDatabaseById(id)) 
.run(getUserFromDatabaseByEmail(email)) 
// ... 
.gotResult(function (user) { 
    console.log('We have user!'); 
}) 
.allFailed(function() { 
    console.log('No joy!'); 
}) 
+0

「否則」你的意思是「如果它拒絕」? – Bergi

+0

是的,我在考慮最初拒絕,但現在,我不太確定,也許我應該用空值來解決?我可以控制這些功能。 –

+1

我認爲拒絕是要走的路 - 儘管從我的回答中,你可以看到我最初是以另一種方式思考 - 我認爲我的答案涵蓋了兩個思想流派:p –

回答

2

它仔細看,這是不是最好的辦法

假設下面決心所有功能,如果他們可以在用戶,或者解決爲falseyfalse,'',null,undefined,0 etc)如果他們不能,並且d on't拒絕在沒有找到

getUserFromFileById(id).then(function(user) { 
    return user || getUserFromFileByEmail(email) 
}).then(function(user) { 
    return user || getUserFromDatabaseById(id) 
}).then(function(user) { 
    return user || getUserFromDatabaseByEmail(email) 
}).then(function(user) { 
    if (user) { 
     console.log('woot got user'); 
    } 
    else { 
     console.log('no user'); 
     throw 'no user'; 
    } 
}).catch(function(fail) { 
    console.log('something went wrong'); 
}); 

說完看着它的用戶/拋出,這樣更有意義

這裏假設你的函數決心一個用戶否則拒絕承諾 - 我認爲這通常更有意義?沒有?

getUserFromFileById(id).catch(function() { 
    return getUserFromFileByEmail(email); 
}).catch(function() { 
    return getUserFromDatabaseById(id); 
}).catch(function() { 
    return getUserFromDatabaseByEmail(email); 
}).then(function(user) { 
    console.log('woot got user', user); 
}, function(fail) { 
    console.log('something went wrong', fail); 
}); 
+0

@Bergi - 謝謝,這更清潔! (這是一個很好的一天,當你學到一些東西的時候,我從來沒有考慮過像這樣的鏈接catch) –

+0

那麼'.then(null,...)'和'.catch(...)'(至少在ES6中)完全一樣 – Bergi

+0

I'我總是認爲雖然有一些「終結」,但當然,你是正確的,看到這樣的漁獲鏈仍然有點外國在一個_try/catch_意義上 –