javascript回调函数同步
javascript callback function synchronise
我目前正在研究一项 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 变量?
提前致谢。
根据 documentation, handle
can return a promise,这将允许您在收到数据后构建响应。
理想情况下,您会将 findWarehouseKeepers
更改为 return 一个承诺,但这里是一个对您的代码进行最小更改的示例:
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
更改为 return 一个承诺,那么您可能会写 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()
}
我目前正在研究一项 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 变量? 提前致谢。
根据 documentation, handle
can return a promise,这将允许您在收到数据后构建响应。
理想情况下,您会将 findWarehouseKeepers
更改为 return 一个承诺,但这里是一个对您的代码进行最小更改的示例:
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
更改为 return 一个承诺,那么您可能会写 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()
}