提问者:小点点

node.js中回调中带有await的递归函数


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

 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

共1个答案

匿名用户

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

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"