首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >离子2/类型脚本/角2中递归函数的返回承诺

离子2/类型脚本/角2中递归函数的返回承诺
EN

Stack Overflow用户
提问于 2017-12-30 18:39:43
回答 1查看 1K关注 0票数 1

我有异步递归函数,这需要一些时间来执行。

见以下两个函数

代码语言:javascript
复制
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

我怎样才能做到这一点?

此外,我尝试了如下

代码语言:javascript
复制
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

请给我一个解决这个问题的建议。

谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2017-12-30 22:42:30

你可以把整件事想象成一列火车(一列应许火车),以及你想要在那列火车上调用的货车功能。你要做的就是把它们按正确的顺序连接起来。

有两种方法可以把货车连接到火车上。一种方法是对允诺的then函数进行回调。第二种方法是在一个回调中返回另一个承诺。

下面是一个如何构造代码的示例:

代码语言:javascript
复制
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);
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48036828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档