AWS:Alexa 技能模板中的 intentHandler.call() 取消了前面的函数调用

AWS: intentHandler.call() in Alexa skills template cancels out preceding function call

我正在尝试从 Lambda 函数发布到 IoT 主题,该函数由 Alexa 技能触发。在 Lambda 函数中,我正在执行此 IoT 发布:

var params = {
  topic: 'testTopic',
  payload: new Buffer('test message'),
  qos: 1
};

iotData.publish(params, function(err, data) {
  if (err) console.log('ERR: ', err); // an error occurred
  else if (data) console.log('DATA: ', data);  // successful response
});

如果我 运行 在 Lambda 函数中使用此代码(并且仅此代码),它可以正常工作。但是,如果我将参数和发布函数放在 Alexa Skill 模板的 onIntent 函数中,并将其放在新的 Lambda 函数中,它就不起作用。 (两个 Lambda 函数具有相同的配置和策略。)

如果我注释掉 intentHandler.call(),那么 iotData.publish() 会执行 运行,所以看起来 intentHandler 调用由于某种我不明白的原因正在取消它.

onIntent: function (intentRequest, session, response) {
  var intent = intentRequest.intent,
      intentName = intentRequest.intent.name,
      intentHandler = this.intentHandlers[intentName];

  if (intentHandler) {
    console.log('dispatch intent = ' + intentName);

    var params = {
      topic: 'testTopic',
      payload: new Buffer('test message'),
      qos: 1
    };

    iotData.publish(params, function(err, data) {
      if (err) console.log('ERR: ', err); // an error occurred
      else if (data) console.log('DATA: ', data);  // successful response
    });

    intentHandler.call(this, intent, session, response);
  } else {
    throw 'Unsupported intent = ' + intentName;
  }
}

这似乎与 Lambda 函数上下文有关。 intentHandler.call() 调用相关意图,后者又调用 context.succeed()。我假设这意味着 Lambda 函数在可以执行 iotData.publish() 调用之前完成 运行,因为当我像这样将 intentHandler.call() 放入 iotData.publish() 的回调中时,一切工作正常:

onIntent: function (intentRequest, session, response) {
  var intent = intentRequest.intent,
      intentName = intentRequest.intent.name,
      intentHandler = this.intentHandlers[intentName];

  if (intentHandler) {
    console.log('dispatch intent = ' + intentName);

    var params = {
      topic: 'signals',
      payload: new Buffer(intentName),
      qos: 1
    };

    iotData.publish(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else {
        console.log(data);           // successful response
        intentHandler.call(this, intent, session, response);
      }     
    });
  } else {
    throw 'Unsupported intent = ' + intentName;
  }
}