2017-06-04 118 views
2

我目前正在生產的Google Apps腳本中的某些代碼需要完成一個對象,其中一個屬性由異步請求的結果設置。這個對象,具體來說,這個屬性然後在線以後使用。但是,因爲請求在需要該屬性的函數運行時還沒有返回,所以它們沒有正確評估。 我的代碼如下:在繼續執行Google Apps腳本之前等待異步請求返回

function Thing(val) { 
    var self = this 

    var createSuccess = function(data) { 
     self.foo = data; 
    } 

    var init = function(val) { 
     google.script.run.withSuccessHandler(createSuccess).serverFunc(val); 
    }; 

    init(val); 
} 

function objStuff() { 
    var foobar = new Thing('bar'); 
    // Do stuff with foobar.foo 
} 

objStuff(); 

目前使用foobar.foo不能正常工作,因爲劇本沒等繼續之前腳本的返回值的東西。

在繼續我的腳本的其餘部分之前,有什麼方法可以等待foo屬性用異步請求進行評估?

回答

4

您可以添加一個回調作爲參數的構造器:

function Thing(val, cb) { 
    var self = this 

    var createSuccess = function(data) { 
     self.foo = data; 
     cb(); // this gets called when data is ready 
    } 

    var init = function(val) { 
     google.script.run.withSuccessHandler(createSuccess).serverFunc(val); 
    }; 

    init(val); 
} 

function objStuff() { 
    var foobar = new Thing('bar', function() { 
     // Do stuff with foobar.foo 
    }); 
} 

objStuff(); 
+1

神奇和死的簡單。非常感謝。 – dbr

0

我recomendation是,如果你正在利用的的NodeJS,因爲它允許你創建一個事件偵聽器使用events模塊。

所以你可以做這樣的事情

eventEmitter.on('listener_key', function(){ 
    //your code to be executed after the event 
}); 

funtion emitStuffToListener(){ 
eventEmitter.emit('listener_key'); 
} 

編輯:對不起,我missread的帖子,但你仍然可以做面向事件的發展與Google Apps Event Objects

+0

正如問題所述,我使用Google Apps腳本,因此nodejs不是一個選項。 – dbr