为了账号安全,请及时绑定邮箱和手机立即绑定

javascript回调函数同步

javascript回调函数同步

慕后森 2023-12-14 15:48:48
我目前正在研究 Alexa Skill,以从 SAP 系统收集数据。由于我的函数中有一个用于收集数据的回调,因此 Alexa 在 talkOutput 变量更新之前会说话。const LagerhueteIntent = {    canHandle(handlerInput) {        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest' &&            Alexa.getIntentName(handlerInput.requestEnvelope) === 'LagerhueteIntent';    },    handle(handlerInput) {        let speakOutput;        console.log("test");        findWarehouseKeepers(function(warehouseKeeper) {            console.log(warehouseKeeper);            speakOutput = "Die Lagerhüter sind die Produkte mit den Ids" + warehouseKeeper;            console.log(speakOutput);        });        return handlerInput.responseBuilder            .speak(speakOutput)            //.reprompt('add a reprompt if you want to keep the session open for the user to respond')            .getResponse();    }};用我的功能:function findWarehouseKeepers(callback) {    var args = getArgs();    console.log(args);    var Client = require('node-rest-client').Client;    var client = new Client();    client.get("http://XXXXXXXX$format=json", args, function(data, response) {        let validValuesList = new List([]);        data.d.results.forEach(function(data) {            validValuesList.add(data.ProductId);        });        console.log(validValuesList);        let validValuesAsArray = validValuesList.toArray();        console.log(validValuesAsArray);        callback(validValuesAsArray);    });}如何使我的函数同步,以便在执行下一个代码之前更新 talkOutput 变量?提前致谢。
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

根据文档,handle可以返回一个承诺,这将允许您在收到数据后构建响应。

理想情况下,您会进行更改findWarehouseKeepers以返回承诺,但这里是一个对代码进行最小更改的示例:

handle(handlerInput) {

  return new Promise(resolve => {

    findWarehouseKeepers(warehouseKeeper => {

      const speakOutput = "Die Lagerhüter sind die Produkte mit den Ids" + warehouseKeeper;

      resolve(

        handlerInput.responseBuilder

          .speak(speakOutput)

          .getResponse()

      );

    });

  });

}

当然,您还需要考虑如果请求失败该怎么办,即您想拒绝承诺。


如果您更改findWarehouseKeepers为返回承诺,那么您可能可以将声明编写handle为(我不知道该代码在哪个环境中运行)并以看起来async同步的方式编写代码:


async handle(handlerInput) {

  const warehouseKeeper = await findWarehouseKeepers();

  return handlerInput.responseBuilder

    .speak("Die Lagerhüter sind die Produkte mit den Ids" + warehouseKeeper)

    .getResponse()

}


查看完整回答
反对 回复 2023-12-14
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信