2015-12-07 81 views
2

在Meteor編碼時,我發現自己在多個方法調用中互相嵌套 - 第一個方法觸發,然後在回調中,第二個觸發是依賴的對第一個人的結果等等。有沒有更好的模式使用多個方法沒有內嵌回調方法調用?代碼很快變得混亂。多種方法的流星模式調用順序回調

Meteor.call('unsetProduct', product._id, omitObj, function(err, result) { 
if(!err) { 

    Meteor.call('editProduct', product._id, object, function(err, result) { 
     if(!err) { 

      //if no error, then continue to update the product template 
       Meteor.call('editProductTemplate', self._id, obj, function(err, result) { 
        if(!err) { 
         //call some other method 

        } 
        else { 
         FormMessages.throw(err.reason, 'danger'); 
        } 
       }); 
     } 
     else { 
      FormMessages.throw(err.reason, 'danger'); 
     } 
    });//end edit product 

} 
else { 
    AppMessages.throw(err.reason, 'danger'); 
} 

});`

+0

是否有一個原因,你不想把所有這一切都放在單一的服務器方法?如果可能的話,這是處理這些事情的最簡單方法。 – danSiebes

+0

使用一種能夠發出相關錯誤的方法似乎更好。如果你想要一個更好的異步流程設計模式,你可以使用未來/承諾。 – MasterAM

回答

0

看一看reactive-method包。我認爲它完全符合您的需求:它將異步Meteor.call s包裝到同步代碼中。有了它,你的代碼看起來更乾淨,像

try { 
    const result = ReactiveMethod.call('unsetProduct', product._id, omitObj); 
} catch (error) { 
    AppMessages.throw(err.reason, 'danger'); 
} 

try { 
    const nestedResult = ReactiveMethod.call('editProduct', product._id, object); 
} catch (error) { 
    FormMessages.throw(err.reason, 'danger'); 
} 

try { 
    const evenMoreNestedResult = ReactiveMethod.call('editProductTemplate', self._id, obj); 
} catch (error) { 
    FormMessages.throw(err.reason, 'danger'); 
} 

當您添加內部try陳述一些邏輯,這將看起來更好。

+0

我剛纔看到這個問題和我的一樣,但還有其他一些建議:http://stackoverflow.com/questions/28633187/avoiding-callback-hell-with-multiple-meteor-method-calls-on-客戶?rq = 1 – user2387823

+0

當然,答案很好。但我個人不喜歡承諾(對於他們醜陋的點語法),並堅持讓代碼同步,或者至少看起來像同步。在ES6中,有異步/等待,使得代碼在以異步方式執行時看起來同步。我相信ReactiveMethod開發人員很快就會採用它,因爲在底層,它也基於Promises。 –