我有异步递归函数,这需要一些时间来执行。
见以下两个函数
public sendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){
this.promise = new Promise((resolve, reject) => {
this.doSendAndRecivesMessage(content, finalMessage, outMessageCount);
console.log("Have to wait until above function finish executing");
resolve (finalMessage);
});
return this.promise;
}
private doSendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){
let newContent = IREDMART_KEYWORD + APP_IDENTITY + outMessageCount + " " + content;
let message:Message = new Message(newContent, API_END_POINT);
this.sendMessage(message);
let promise = this.recieveMessage();
promise.then((message) => {
let inMessageCount:number = message.content.split(MSG_COUNT_SEPARATOR)[1];
finalMessage.content += message.content.split(MSG_COUNT_SEPARATOR)[2];
if(inMessageCount == 1){
finalMessage.reciever = message.reciever;
finalMessage.date = message.date;
}
else{
this.sendAndRecivesMessage(content, finalMessage, outMessageCount + 1);
}
});
}在这里,doSendAndRecivesMessage函数需要一些时间来执行,而且它是一个递归函数。
在sendAndRecivesMessage函数中,我需要等待上述函数的执行,并必须返回finalMessage
我怎样才能做到这一点?
此外,我尝试了如下
public sendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){
let newContent = IREDMART_KEYWORD + APP_IDENTITY + outMessageCount + " " + content;
let message:Message = new Message(newContent, API_END_POINT);
this.promise = new Promise((resolve, reject) => {
this.sendMessage(message);
let promise = this.recieveMessage();
promise.then((message) => {
let inMessageCount:number = message.content.split(MSG_COUNT_SEPARATOR)[1];
finalMessage.content += message.content.split(MSG_COUNT_SEPARATOR)[2];
if(inMessageCount == 1){
finalMessage.reciever = message.reciever;
finalMessage.date = message.date;
resolve(finalMessage);
}
else{
this.sendAndRecivesMessage(content, finalMessage, outMessageCount + 1);
}
});
});
return this.promise;
}但是由于函数是异步的和递归的,所以返回承诺不包含解析的finalMessage。
请给我一个解决这个问题的建议。
谢谢
发布于 2017-12-30 22:42:30
你可以把整件事想象成一列火车(一列应许火车),以及你想要在那列火车上调用的货车功能。你要做的就是把它们按正确的顺序连接起来。
有两种方法可以把货车连接到火车上。一种方法是对允诺的then函数进行回调。第二种方法是在一个回调中返回另一个承诺。
下面是一个如何构造代码的示例:
function randomNumber() {
// a function that can later return a value
return Promise.resolve(Math.random());
}
// recursive function, keeps calling itself until the condition is met
function collectValues(until, previous) {
// call the async function return a promise
return randomNumber().then((value) => {
// when we get a number we check the condition
console.log(`prev:${previous} new:${value}`);
let result = previous + value;
if (result > until) {
// when satisfied just return the final message
return result;
} else {
// return the promise from the next recursive call with new params
return collectValues(until, result);
}
});
}
collectValues(5, 0).then(console.log);https://stackoverflow.com/questions/48036828
复制相似问题