2015-11-14 51 views
0

我想在Node.js的XMPP客戶promisify事件發射器,這是我的代碼:使用與事件發射的承諾

this.watiForEvent = function (eventEmiter, type) { 
    return new Promise(function (resolve) { 
     eventEmiter.on(type, resolve); 
    }) 
}; 

this._response = function() { 
    return this.watiForEvent(this.client, 'stanza'); 
}; 

在上面的代碼我promisify的XMPP節事件發射器並使用它像這樣

東西
CcsClient.prototype.responseHandler = function() { 
    var _this = this; 

    return _this._response().then(function (stanza) { 

     _this.responseLimit--; 

     if (stanza.is('message') && stanza.attrs.type !== 'error') { 
      var messageData = JSON.parse(stanza.getChildText("gcm")); 

      switch (messageData.message_type) { 
       case 'control': 
        if (messageData.control_type === 'CONNECTION_DRAINING') { 
         _this.draining = true; 
        } 

        return; 

       case 'ack': 
        return { 
         messageId: messageData.message_id, 
         from: messageData.from 
        }; 


        gcm.responseHandler().then(function (options) { 
         console.log(options); 
        }). 
        catch (function (error) { 
         console.log(error); 
        }); 

我的問題是節剛剛被稱爲一次的事件。也許諾言不好?

+1

'watiForEvent'有一個錯字。仔細檢查你的代碼。 – Tomalak

+0

當然,它只被稱爲一次,你在等待下一個事件,然後用它履行你的承諾。你還期望什麼? – Bergi

回答

2

ES6-承諾有3個狀態,未決解決拒絕
在您提供的代碼eventEmitter正在解決承諾多次

eventEmiter.on(type, resolve); 

那是行不通的,因爲一旦承諾是拒絕或解決其狀態無法改變,你解決不了承諾多次

我建議使用觀察的模式

function observable(){ 
    var cbs = { }; // callbacks; 
    return { 
     on: function(type,cb) { 
      cbs[type] = cbs[type] || []; 
      cbs[type].push(cb); 
     }, 
     fire: function(type){ 
      var arr = cbs[type] || []; 
      var args = [].slice.call(arguments,1); 
      arr.forEach(function(cb){ 
       cb.apply(this,args); 
      }); 
     } 
    } 
} 
+0

感謝您的回答 –

+0

這不是(JS)可觀察模式 - 對於實際的可觀察性(希望將包含在ES的下一個版本中),您需要類似Rx或培根的東西。 –