2015-07-12 116 views
0

所以,我有一個這樣的代碼。promisifying同步功能

我想把它變成類似的東西。

 getSomethingAsync(something) 
    .then(doSomethingAsync) 
    .then(doSomethingSync) 
    .then(doSomethingAsyncNext) 
    .then(function(val) { 
     //All done 
     }) 
     .catch(err_handler); 

我應該改變doSomethingSync是:

 function(data) { 
     // do a lot of things with data, throw errors for invalid data 
     return changed_data; 
     } 

到:

 function(data) { 
     // do a lot of things with data, throw errors for invalid data 
     return new Promise(function(resolve,reject){ 
     resolve(changed_data); 
     }); 
     } 

或:

 function(data) { 
     return new Promise(function(resolve,reject){ 
     // do a lot of things with data, reject for invalid data 
     resolve(changed_data); 
     }); 
     } 
+2

爲了強調費利克斯的觀點 - 你根本不需要承諾 - 承諾讓你混合搭配。 –

+0

@BenjaminGruenbaum這是否意味着,我仍然可以調用其他功能,即使鏈中的最後一個承諾已經解決? – cswl

回答

5

我應該改變doSomethingSync這是...

您不必全部更改。如果回調的返回值是而不是承諾,則直接用於解決.then返回的承諾。 .then回調沒有返回承諾。

可以

return Promise.resolve(changed_data); 

但同樣,也沒有必要。 return changed_data;也同樣適用。

+0

清除並有助於實現同步功能。如何處理需要回調函數的異步函數? –

+0

然後你只需從回調中返回一個承諾。 –

+0

@FelixKling不,你不能從回調中返回一個承諾。您還需要單獨提示基於回調的函數。 –