javascript回调函数同步

我目前正在研究 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 变量?提前致谢。


慕后森
浏览 55回答 1
1回答

HUWWW

根据文档,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()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript