递归,Node js和异步调用

塔希尔·米尔扎(Tahir Mirza)|

我试图将savePlaces数组作为最终输出,以便可以在响应中返回它。但是我在function2()中获得了未定义的成功。为什么我没有按预期获得savePlaces。请提供解决方案。

var saveOverriddenPlaces = function(index, savePlaces) {
    var groupSettingsDAO = new GroupSettingsDAO();
    var deferred = q.defer();
    if (index == savePlaces.length) {
        console.log("-----------------------------deferred--------------------------------", deferred);
        console.log("LAST RETURN -----------------------------" + savePlaces + "----------------------------------------------------", index);
        deferred.resolve(savePlaces);
        return deferred.promise;
    }
    var placeInfo = {
        "id": savePlaces[index].id,
        "groupurl": savePlaces[index].groupurl,
        "sla": savePlaces[index].sla
    };
    if (savePlaces[index]._id) {
        placeInfo._id = savePlaces[index]._id;
        //update the overriden places in the database
        groupSettingsDAO.updateOverriddenPlace(placeInfo)
            //updates the overriden place and sends result in response when successful else logs error
            .then(
                //success
                function(success) {
                    console.log("recursion ============" + index + "=======================");
                    deferred.resolve(saveOverriddenPlaces(++index, savePlaces));

                    return deferred.promise;
                },
                //failure
                function(error) {
                    console.log("PLACES     ERROR ===================================", error);
                });
        // placesWithID.push(value);
    }
    //WITHOUT ids
    else {
        placeInfo._id = guid();
        savePlaces[index]._id = placeInfo._id;
        groupSettingsDAO.saveOverriddenPlace(placeInfo)
            // saves the overridden place and sends the results in response if successful else logs the error
            .then(
                //success
                function(success) {
                    console.log("recursion ============" + index + "=======================");
                    deferred.resolve(saveOverriddenPlaces(++index, savePlaces));
                },
                //failure
                function(error) {
                    console.log("PLACES     ERROR ===================================", error);

                });
    }
}
function2(req, res) {
    saveOverriddenPlaces(0, req.savePlaces).then(function(success) {
        //getting success as undefined 
        res.send({
            "result": success
        });
    });
}
贝吉

问题在于

deferred.resolve(saveOverriddenPlaces(++index, savePlaces));

您的saveOverriddenPlaces函数不会(总是)返回承诺或值。如果一个函数是异步的,则它必须始终返回一个Promise。

您可以通过在条件语句中returngroupSettingsDAO.…().then(…)调用之前添加a来轻松实现此目的-如果您从其回调中获得了一个价值/承诺,它也会准确地then返回您想要的承诺return

但是,您应尽量避免延迟使用反模式对于您的基本情况,使用该Q函数创建已兑现的承诺,其他所有操作只需链式then调用-无需延迟。

function saveOverriddenPlaces(index, savePlaces) {
    if (index == savePlaces.length) {
        console.log("LAST RETURN -" + savePlaces + "-", index);
        return Q(savePlaces);
    }
    var groupSettingsDAO = new GroupSettingsDAO();
    var placeInfo = {
        "id": savePlaces[index].id,
        "groupurl": savePlaces[index].groupurl,
        "sla": savePlaces[index].sla
    };
    var promise;
    if (savePlaces[index]._id) {
        placeInfo._id = savePlaces[index]._id;
        promise = groupSettingsDAO.updateOverriddenPlace(placeInfo); //update the overriden places in the database
        // placesWithID.push(value);
    } else { // WITHOUT ids
        placeInfo._id = guid();
        savePlaces[index]._id = placeInfo._id;
        promise = groupSettingsDAO.saveOverriddenPlace(placeInfo) // saves the overridden place
    }
    return promise.then(function(success) {
//  ^^^^^^
        console.log("recursion =" + index + "=" + success);
        return saveOverriddenPlaces(++index, savePlaces));
//      ^^^^^^
    });
}
function2(req, res) {
    saveOverriddenPlaces(0, req.savePlaces).then(function(success) {
        //getting success as undefined 
        res.send({
            "result": success
        });
    }, function(error) {
        console.log("PLACES ERROR =", error);
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js的异步调用和递归

来自分类Dev

AngularJS和Node.js的异步调用

来自分类Dev

Node.js杀死异步调用

来自分类Dev

Node.js /使Redis异步调用

来自分类Dev

node.js redis 异步调用

来自分类Dev

使用sequelize对MySQL的Node.js和异步调用阻止了其他用户

来自分类Dev

如何使用Express和Node进行异步调用

来自分类Dev

具有TPL /异步的递归异步调用

来自分类Dev

如何在Node.js中通过异步调用重用测试功能?

来自分类Dev

Node.js并行异步调用,但具有优先级

来自分类Dev

Node.js:从内部带有异步调用的函数返回值

来自分类Dev

使Node.js退出,无论本地模块异步调用是否挂起

来自分类Dev

Node.js:通过异步调用顺序完全执行Websocket响应

来自分类Dev

Node.js:从内部带有异步调用的函数返回值

来自分类Dev

Node.js 使用 Promise.all 返回异步调用?

来自分类Dev

Boost:在异步调用中使用多重递归是否安全?

来自分类Dev

Node.js异步并行递归

来自分类Dev

JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

来自分类Dev

JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

来自分类Dev

在node.js中同步调用

来自分类Dev

在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

来自分类Dev

Node js中的复杂递归

来自分类Dev

Node和异步api调用中的Bluebird.js

来自分类Dev

功能-Node.js中的异步映射,递归和回调的组合

来自分类Dev

在非异步 Javascript 中使用异步调用数据,Node 到 javascript 变量复制

来自分类Dev

如何避免/防止 Node.js 中的无限递归调用?

来自分类Dev

如何在 Node.js 中实现递归 Promise 调用

来自分类Dev

Node.js上与事件相关的递归

来自分类Dev

Node.js护照本地注册上的同步调用

Related 相关文章

  1. 1

    Node.js的异步调用和递归

  2. 2

    AngularJS和Node.js的异步调用

  3. 3

    Node.js杀死异步调用

  4. 4

    Node.js /使Redis异步调用

  5. 5

    node.js redis 异步调用

  6. 6

    使用sequelize对MySQL的Node.js和异步调用阻止了其他用户

  7. 7

    如何使用Express和Node进行异步调用

  8. 8

    具有TPL /异步的递归异步调用

  9. 9

    如何在Node.js中通过异步调用重用测试功能?

  10. 10

    Node.js并行异步调用,但具有优先级

  11. 11

    Node.js:从内部带有异步调用的函数返回值

  12. 12

    使Node.js退出,无论本地模块异步调用是否挂起

  13. 13

    Node.js:通过异步调用顺序完全执行Websocket响应

  14. 14

    Node.js:从内部带有异步调用的函数返回值

  15. 15

    Node.js 使用 Promise.all 返回异步调用?

  16. 16

    Boost:在异步调用中使用多重递归是否安全?

  17. 17

    Node.js异步并行递归

  18. 18

    JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

  19. 19

    JS(node.js)-如果我进行异步调用但不等待其完成,是否可以保证完成执行?

  20. 20

    在node.js中同步调用

  21. 21

    在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

  22. 22

    Node js中的复杂递归

  23. 23

    Node和异步api调用中的Bluebird.js

  24. 24

    功能-Node.js中的异步映射,递归和回调的组合

  25. 25

    在非异步 Javascript 中使用异步调用数据,Node 到 javascript 变量复制

  26. 26

    如何避免/防止 Node.js 中的无限递归调用?

  27. 27

    如何在 Node.js 中实现递归 Promise 调用

  28. 28

    Node.js上与事件相关的递归

  29. 29

    Node.js护照本地注册上的同步调用

热门标签

归档