2015-09-25 49 views
2

我正在嘗試創建一個具有未來的功能。在此功能中,它將等待EndError事件。如果沒有數據寫入x秒,它將返回一個錯誤。這是我寫的。如何用超時和監聽器創建未來

Cylon.execute = function (subroutine, timeout=60000) { 
    let future = new Future(); 
    let done = future.resolver(); 

    let timeoutId = Meteor.setTimeout(function() { 
    done(new Meteor.Error('CylonTimeout')); 
    }); 
    this._messages.on('data',() => { 
    timeoutId = Meteor.setTimeout(function() { 
     done(new Meteor.Error('CylonTimeout')); 
    }); 
    }); 
    this.on('End',() => { 
    Meteor.clearTimeout(timeoutId); 
    done(null, subroutine); 
    }) 
    this.on('Error', (err) => { 
    Meteor.clearTimeout(timeoutId) 
    done(err, null) 
    }); 
    this._commands.write(`Execute #${subroutine}\r`, 'utf8'); 
    return future.wait(); 
} 

我遇到了一些問題。

  • 當未來的回報,該事件偵聽器仍結合
  • 未來可以因爲超時

這是如何通常與期貨的處理返回多次?有沒有辦法清理這些事件?

回答

2

首先我建議你做this.once而不是this.on,這樣你只會觸發事件處理程序一次。 沒有必要多次觸發它。

此外,我建議你做

var self = this; 
done = function (err, result) { 
    //remove all listeners 
    self.removeListener('Error', handler); 
    //.... and so on.... 

    future.resolver()(err, result);//call actual done 
} 

這將防止被調用一次以上的完成和刪除事件偵聽器。

+0

啊,'一次'是非常有幫助的!謝謝你好先生 – corvid

+0

曾經會阻止同一個事件的多次處理,但是如果觸發不同的事件,你仍然會得到多個調用,所以你也必須按照我原來寫的那樣做事件監聽器清理。 – sagie

+0

我唯一的其他問題是處理超時。我無法找到指定「僅從一系列期貨中返回一個未來」的API API中的任何內容(以先到者爲準) – corvid