2017-02-26 62 views
0

我正在研究在AWS Lambda中運行的Node中的Alexa技能,並且在發出事件時無法獲得執行回調的問題。 Alexa的技能,工具包Node.js的README演示傳遞一個回調函數的事件處理程序,並建議使用箭頭功能保護方面:將回調傳遞給事件處理程序

this.emit('JustRight',() => { 
     this.emit(':ask', guessNum.toString() + 'is correct! Would you like to play a new game?', 
     'Say yes to start a new game, or no to end the game.'); 
    }); 

我試圖做同樣的,但發現我的回調永遠不會被執行。我以爲這是因爲AWS LAMBDA限制爲節點4.3.2,箭頭功能不可用,所以我想通過這個背景下回回調的老式方法:

在新建會話處理程序:

if(!account_id) { 
    console.log('Access token:' + accessToken); 
    this.emit('getAccount', accessToken, function (retrieved_id) { 
     console.log('account id in callback: ' + retrieved_id); 
     this.emit('welcome'); 
    }); 
} 

在事件處理程序:

accountHandler = { 
    'getAccount': function (accessToken, cb) { 
     console.log('fetching account id'); 
     var client = thirdparty.getClient(accessToken); 
     var r = client.getAccountForToken(client); 
     r.then(function (data) { 
      console.log('got it:' + data); 
      this.attributes['account_id'] = data; 
      cb.call(this, data); 
     }).catch(function (err) { 
      this.emit('handleApiError', err); 
     }); 
    }, 
} 

我可以看到我成功取回賬號ID,在日誌中,但拉姆達沒有錯誤,沒有調用我的回調函數執行。我試圖找出在Promise'then'函數內是否存在調用回調的問題,或者如果有其他事情正在進行。

回答

0

確切的問題是承諾函函數中缺少上下文。我解決了這個問題,通過使用getAccount處理程序中的箭頭功能:

r.then(data => { 
    console.log('got it:' + data); 
    this.attributes['account_id'] = data; 
    this.emit('welcome'); 
}) 

當然,這也表明,LAMBDA Node.js的功能支持箭頭的功能就好了。

相關問題