2015-12-03 42 views
0

一般來說,一旦容易使用once即可監聽事件。收到與正則表達式匹配的消息後解除綁定事件

mySocket.once('connect',() => console.log('connected!')); 

我想要做的是偵聽匹配正則表達式的數據。當收到匹配的數據時,我想解除綁定事件偵聽器並用消息解析。我找不到任何簡單的方法來做到這一點。最好,我想在函數的最後返回一個承諾這裏是我的嘗試之一:

listenOnce(regex) { 
    let listener; 
    let timeoutId; 
    return new Promise((resolve, reject) => { 
    timeoutId = setTimeout(() => reject(new Error('Timeout exceeded')), 60000); 
    listener = function (data, resolve, reject) { 
     if (regex.test(data.toString('ascii'))) { 
     resolve(data.toString('ascii')); 
     } 
    }.bind(this, resolve, reject); 
    this.socket.on('data', listener); 
    }).then(() => { 
    this.socket.removeListener('data', listener); // this doesn't work 
    clearTimeout(timeoutId); 
    }); 
} 
+0

「listener」的定義在哪裏?它在你的函數中似乎是'未定義的'。你用'regex'做什麼? – Bergi

+0

我認爲你應該只是promisify'一次'方法,並承諾一切做其他事情。 – Bergi

+0

看起來你正走向正確的道路。但是,您不會向我們展示「偵聽器」函數代碼,因此我們無法真正瞭解您可能在那裏做錯了什麼。到目前爲止你所嘗試的什麼不起作用?我看到的一件事是,如果你超時,你需要'removeListener()'。我也不清楚你是否在'.bind()'中綁定了正確的'this'值。 – jfriend00

回答

0

有零的理由在這裏使用bind - 只是讓封做其工作。您當前的代碼不起作用,因爲bind會綁定第一個參數,而不是最後一個,因此data不會是數據。

function listenOnce(regex) { 
    let listener, timeoutId; 
    return new Promise((resolve, reject) => { 
    timeoutId = setTimeout(() => reject(new Error('Timeout exceeded')), 60000); 
    listener = (data) => { 
     const str = data.toString('ascii'); 
     if (regex.test(str)) 
     resolve(str); 
    }; 
    this.socket.on('data', listener); 
    }).finally(() => { 
    this.socket.removeListener('data', listener); 
    clearTimeout(timeoutId); 
    }); 
}