亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號