2017-09-21 33 views
0

我想从'LaunchRequest''TellAJoke'意图的字符串数组传递。Alexa会话属性不持续跨意图功能

我的问题是,this.attributes['joke']始终未定义在'TellAJoke'函数中。

'LaunchRequest': function() { 
    var url = "https://www.reddit.com/r/jokes/top.json?limit=1"; 
    var self = this; 

    var request = https.get(url, function(res) { 
     var body = ''; 
     res.on('data', function(chunk){ 
      body += chunk; 
     }); 
     res.on('end', function(){ 
      var redditResponse = JSON.parse(body); 
      redditResponse['data'].children.forEach(function(child) { 
       jokeArray.push({ 
        title: child.data.title, 
        text: child.data.selftext 
       }); 
      }); 

      // Assinging the filled jokeArray to the session variable 
      self.attributes['joke'] = jokeArray; 
      self.emit(':saveState', true); 

    }).on('error', function(e){ 
     self.emit(':tell', "Error"); 
     console.log("Got an error: ", e); 
    });  
    this.emit('TellAJoke'); 
    }); 
}, 

'TellAJoke': function() { 
    this.attributes['randomNumber'] = Math.floor(Math.random() * 8) +0; 
    //This prints undefined 
    console.log(this.attributes['joke']); 
}, 

现在,我已经在这里读了类似的问题,但我没有足够的反应变量什么在那里发生的解释。基本上,我希望由于this.emit(':saveState', true)该变量将会持续,但它是未定义的。有任何想法吗?

+0

您是否必须使用“this.emit”调用TellAJoke?你可以选择将这个函数作为TellAJoke(self)来调用,然后使用self.emit将该笑话告诉给用户。 – Amit

+0

@Amit我改变了这整个流程。我相信这是一个异步的问题。 – ffritz

+0

在这种情况下,我相信你需要提供'.on('success',function(e){//在这里调用tellajoke})' – Amit

回答

1

使用发出结束块内。

res.on('end',() => { 
    this.emit('TellAJoke'); 
}) 

对于错误处理将其传递到未处理SessionEndedRequest意图。

使用emitWithState( '')代替 EMIT( '')上移动到另一个意图。