【问题标题】:javascript callback function synchronisejavascript回调函数同步
【发布时间】:2020-12-17 15:03:14
【问题描述】:

我目前正在研究一项 Alexa 技能,以从 SAP 系统收集数据。因为我的函数中有一个回调来收集数据,所以 Alexa 在 speakOutput 变量更新之前会说话。

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);
    });
}

如何使函数同步,以便在执行下一个代码之前更新 speakOutput 变量? 提前致谢。

【问题讨论】:

  • 忘记尝试从仅初始化异步操作的函数返回某些内容。 IMO 在您提供给 findWarehouseKeepers 的回调函数中执行 .speak 部分。
  • handle 可以返回一个响应的承诺吗?
  • @Bergi:是的。我只是在研究这个。 developer.amazon.com/en-US/docs/alexa/…

标签: javascript callback synchronized


【解决方案1】:

根据documentationhandle 可以返回一个promise,这将允许您在收到数据后构建响应。

理想情况下,您应该更改 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 以返回一个承诺,那么您可能会写 declare handle as async (我不知道这段代码在哪个环境中运行)并以 的方式编写代码看起来同步:

async handle(handlerInput) {
  const warehouseKeeper = await findWarehouseKeepers();
  return handlerInput.responseBuilder
    .speak("Die Lagerhüter sind die Produkte mit den Ids" + warehouseKeeper)
    .getResponse()
}

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-02-17
    • 2017-02-04
    相关资源
    最近更新 更多