javascript - 正确使用 Promise 返回结果

标签 javascript promise

我正在使用the 'Q' library为了 promise 。

这是场景:

var results = dbContext.query(userCert.conn, dbQuery.BuildQuery(query));

var models = [];
if (!results.hasErr) {
    for (var r in results.okPacket.results) {
        var m = new model(results.okPacket.results[r]);
        models.push(m);
    }
}
userCert.conn.end(); // close db connection

dbContext.query(...)中:

var $Q = require('Q');

function execQuery(connection, query) {
    console.log("[backend][context] EXEC QUERY: " + query);
    $Q.nfcall(connection.query, query)
        .then(function (err, results) {
            var ret = {};
            if (err) {
                // log
                var errPkt = getErrPacket(err);
                console.log("QUERY ERROR[" + errPkt.errCode + ": " +
                errPkt.errConst + "]: " + errPkt.errMessage);
                ret = {
                    hasErr: true,
                    errPacket: errPkt
                };
            } else {
                ret = {
                    hasErr: false,
                    okPacket: {
                        resType: results.constructor.name,
                        resLength: results.length,
                        results: results
                    }
                };
            }

            // is this correct?
            return function () {
                return ret;
            };
        })
        .then(function (ret) {
            // how do I then return ret to the caller?
        })
        .done();
}

我只是在执行此操作的过程中有点迷失(如果可能的话)。回调在我的应用程序的较低级别中是可以的,但我不想最终得到一盘充满回调意大利面的菜。

最佳答案

使用 promise ,您只需将 promise 返回给调用者即可:

function execQuery(connection, query) {
    console.log("[backend][context] EXEC QUERY: " + query);
    return $Q.nfcall(connection.query, query)
        .then(function(results) {
            return {
                hasErr: false,
                okPacket: {
                    resType: results.constructor.name,
                    resLength: results.length,
                    results: results
                }   
            };
        })
        .catch(function(err) {
            // This doesn't necessarily mean a database error because
            // all errors are caught here
            if (false /*
                TODO logic that checks if the err is not a database error
                in which case you should just rethrow
            */) {
                throw err;
            }
            var errPkt = getErrPacket(err);
            console.log("QUERY ERROR[" + errPkt.errCode + ": " +
            errPkt.errConst + "]: " + errPkt.errMessage);
            return {
                hasErr: true,
                errPacket: errPkt
            };
        });
}

调用者可以只使用返回的 promise :

dbContext.query(userCert.conn, dbQuery.BuildQuery(query))
    .then(function(results) {
        // It is really weird to have to check for error in the success
        // case but whatever floats your boat
        if (!results.hasErr) {
            var models = results.okPacket.results.map(function(result) {
                return new model(result);
            });
        }
    })
    .finally(function() {
        userCert.conn.end();
    })
    .done();

关于javascript - 正确使用 Promise 返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182052/

相关文章:

javascript - 查找任意表单元素

javascript - Google Drive SDK 示例 python DrEdit 不工作(身份验证时闪烁,未显示编辑器)

node.js - 我应该如何在 Node js 中使用 Promise 进行 db + http 调用

javascript - 浏览器中的事件循环如何同时处理事件队列、作业队列、渲染队列?

javascript - Threejs 变换矩阵排序

Javascript:如何使用第三方获取浏览器缩放级别

javascript - 当 JavaScript 中引入异步值时,如何最大限度地减少重构?

javascript - 在promise链nodejs中传递数据

javascript - 从重复调用的 promise 返回服务中获取最新数据

javascript promise onSuccess 处理程序