2016-08-01 84 views
0

我在順序執行函數/方法時遇到了vuejs中的一些問題。 我有這樣三個功能:在vuejs中順序調用函數

MethodA: function(){ 
    if(x = 1){ 
     value1 = 2; 
    } 

    if (x ==2){ 
     value2 = 4; 
    } 

    this.MethodB(); 
} 

MethodB: function(){ 
    Total value = value1 + value2; 
} 

MethodC: function(){ 
    this.$http.get('api/getvalue').then(function(response){ 
     this.set('somedata', response.data); 

     response.data.forEach(para){ 
      if(para.id == 1){ 
       this.MethodA(); 
      } 
      if(para.id == 2){ 
       this.MethodA(); 
      } 
     } 
    }); 
} 

ready: function(){ 
    this.MethodC(); 
} 

我想只有MethodCMethodA完全執行後執行this.MethodB()。我怎樣才能做到這一點?

+0

我編輯了你的問題,寫'MethodC',但現在我不知道你的意思。你能解釋一下,如果他們彼此循環依賴,你希望如何在其他人之前或之後執行任何「方法」? – gurghet

+0

我會用'.then'來使用[Promise](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise)來鏈接這些調用。 – Elfayer

回答

2

您可以使用JavaScript少輝與Vue.js方法:

methodA: function() { 
    return new Promise(function(resolve, reject) { 
     //run all your methodA code here 
     ... 

     resolve('MethodA finished'); 
    }); 
}, 
methodB: function() { 
    return new Promise(function(resolve, reject) { 
     //run all your methodB code here 
     ... 

     resolve('MethodB finished'); 
    }); 
}, 
methodC: function() { 
    //run your methodC code 
} 

現在,運行methodC只有當和了methodA的methodB完成後,您可以使用的承諾.then,並把它們連在一起。對於前:

ready: function() { 
    //save `this` to a variable just to make it easier to be accessed within the chain 
    let self = this; 

    //run methodA, then methodB...only then, methodC 
    self.methodA.then(function(resultA) { 
     console.log(resultA); 
     return self.methodB(); 
    }).then(function(resultB) { 
     console.log(resultB); 
     self.methodC(); 
    }); 
} 

注意:如果在運行AJAX中或了methodA調用的methodB,確保當您收到響應,只解決了承諾。在你的例如:

this.$http.get('api/getvalue').then(function(response){ 
    ... 
    resolve('My method is now complete'); 
} 
+0

謝謝你crabbly !!!,會按照你的建議嘗試。 –

+0

@TashiTobgay歡迎您:) Javascript承諾非常適合異步代碼控制。 – crabbly