javascript回调函数同步

标签 javascript callback synchronized

我目前正在研究 Alexa Skill,以从 SAP 系统收集数据。由于我的函数中有一个回调来收集数据,因此 Alexa 在spokeOutput 变量更新之前会说话。

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

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

最佳答案

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

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

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

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


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

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

关于javascript回调函数同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65343230/

相关文章:

jquery - 如何停止jquery回调函数?

java - 与 Java 中的 volatile 字段和同步块(synchronized block)的关系——以及它们对非 volatile 变量的影响?

java - 线程安全在 Java 中实现单例模式的有效方法?

java - Java 中的阻塞线程——要避免吗?

jQuery 等待第一个动画完成后再开始下一个动画

javascript - 调用曾孙组件方法

javascript - 根据页面子域本地化脚本 URL

javascript - 从表单选项获取 ID 并用它填充多个字段

javascript - 哪种编写回调的方法更好?

javascript - Phaser.text 上下无 Angular