【问题标题】:Recursive function with await in callback in node.js在node.js中的回调中带有等待的递归函数
【发布时间】:2020-09-29 22:30:43
【问题描述】:

节点中的代码及其递归方法。 我的最终目标是等待该过程完成,然后再开始另一个。因为它将写入数据库

 router.post('/contactImport', function (req, res) {
        var ContactList = req.body.contacts;
        var pageSize = 3;
        var offset = 0;        
            ImportingContactTest(contactList, pageSize, offset, function (callbackTestCall) {
                console.log("ImportingContactTest_final: ", callbackTestCall);
            });
        res.send("Ok");
    });

递归函数:

function ImportingContactTest(contactList, pageSize, offset, callbackImportingContactTest) {
    const fragment = GetContactFragment(contactList, pageSize, offset);
    console.log("fragmentData_length: ", fragment.data.length);
    if (fragment.nextPage) {
        offset = fragment.nextPage;
        console.log("offset: ", offset);
        ImportingContactTest(contactList, pageSize, offset, function (callbackImportingContactTest_1) {
            console.log("Test Processes");
            callbackImportingContactTest("All Done");
        });
    } else {
        callbackImportingContactTest("All Done Else");
    }
};

获取要上传的批次:

const GetContactFragment = (contactList, pageSize, offset = 0) => {
    return {
        data: contactList.slice(offset, offset + pageSize),
        nextPage: offset +
            pageSize < contactList.length ? offset + pageSize : undefined
    }
};

我现在得到的结果:

ContactList:  10
pageSize:  3
fragmentData_length:  3
offset:  3
fragmentData_length:  3
offset:  6
fragmentData_length:  3
offset:  9
fragmentData_length:  1
Test Processes
Test Processes
Test Processes
ImportingContactTest_final:  All Done

我想要的结果:

ContactList:  10
pageSize:  3
fragmentData_length:  3
offset:  3
Test Processes
fragmentData_length:  3
offset:  6
Test Processes
fragmentData_length:  3
offset:  9
Test Processes
fragmentData_length:  1
ImportingContactTest_final:  All Done

【问题讨论】:

    标签: node.js typescript recursion callback


    【解决方案1】:

    从我的角度来看,您过度设计了代码。而不是使用 异步回调同步函数可以完成这项工作。

    const GetContactFragment = (contactList, pageSize, offset = 0) => {
        return {
            data: contactList.slice(offset, offset + pageSize),
            nextPage: offset +
                pageSize < contactList.length ? offset + pageSize : undefined
        }
    };
    
    function ImportingContactTest(contactList, pageSize, offset,callbackImportingContactTest) {
    
        var fragment = GetContactFragment(contactList, pageSize, offset);
        console.log("fragmentData_length: ", fragment.data.length);
        if (fragment.nextPage !== undefined) {
    
            offset = fragment.nextPage;
            console.log("offset: ", offset);
            console.log("Test Processes");
            ImportingContactTest(contactList, pageSize, offset);
    
            fragment = GetContactFragment(contactList, pageSize, offset);
    
        }else {
            return
        }
    
    };
    
    var contactList = [1,2,3,4,5,6,7,8,9,10];
    var pageSize = 3;
    var offset = 0;        
    ImportingContactTest(contactList, pageSize, offset)
    console.log("ImportingContactTest_final");
    

    输出:

    > "fragmentData_length: " 3
    > "offset: " 3
    > "Test Processes"
    > "fragmentData_length: " 3
    > "offset: " 6
    > "Test Processes"
    > "fragmentData_length: " 3
    > "offset: " 9
    > "Test Processes"
    > "fragmentData_length: " 1
    > "ImportingContactTest_final"
    

    【讨论】:

    • 谢谢@Charlie Cai ...但我想在每批完成后返回一些数组数据,为此我使用了回调。
    • @DharmendraPrajapati 你好,但我相信那里没有异步工作,你可以简单地返回你想要的数组。
    • 内部就在那里。我没有把整个代码放在这里。它只是它的样本。正如我所说,它将写入数据库。
    猜你喜欢
    • 2017-07-28
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2021-06-03
    • 2020-09-08
    • 2019-01-19
    相关资源
    最近更新 更多