javascript - 使用 Node (ES6)和 Bluebird promise 混淆

标签 javascript node.js promise bluebird

我遇到了在异步调用完成之前分配值的问题,因此我选择使用 Promises(在本例中为 Bluebird)。我认为这可以解决问题,但鉴于我对 promises/or node 一点都不熟悉,它仍然在做同样的事情。

我将如何着手修改下面的代码,以正确使用 promises?并保持流程,以便我可以根据之前的 row 验证 modules ?

var Promise         = require('bluebird');
var db              = require('../shared/db');
var queryHelper     = require('../shared/queryHelper');
var schemas         = require('../schemas/schemas');
var _               = require('lodash');
var serverSettings  = require('../shared/coreServerSettings');

// Create new instance of mysql module
var connection      = new db();
var queryhelper     = new queryHelper();

// Promised methods
var queryAndWait = Promise.promisify(connection.query);

..剪断..

queryAndWait(query + '; ' + queryFoundRows, params).then(function (result) {
  var payload = [];
  var site_access = [];
  var module_access = [];

  _.each(result[0], function (row) {
    var sites = row.site_access.split(',');
    _.each(sites, function (site_id) {
      site_access.push(site_id);
    });

    row.site_access = site_access;
    site_access = [];

    queryAndWait(queryModules, [row.priv_id]).then(function (result) {
      _.each(result, function (module) {
        var modulePriv = {
          priv_name: module.priv_name,
          priv_num: module.priv_num,
          enabled: module.enabled
        };

        module_access.push(modulePriv);
      });

      //console.log("am assigning " + JSON.stringify(module_access));
      row.module_access = module_access;
      module_access = []
    });

    payload.push(row);
  });
});

澄清一下:

抱歉,模块是用户(行)有权访问的产品组,它们是动态计算的(按位 - 因此没有可用的连接和单独的查询),模块查询返回如下内容,然后我在返回有效负载之前循环并附加到行:

[{"priv_name":"INTERACT","priv_num":1,"enabled":1},{"priv_name":"STAFF_ADMIN","priv_num":32,"enabled":1},{"priv_name":"INT_EDIT","priv_num":64,"enabled":0},{"priv_name":"FAILED_LOGIN","priv_num":128,"enabled":0},{"priv_name":"INT_TAGS","priv_num":256,"enabled":0},{"priv_name":"NC","priv_num":512,"enabled":0},{"priv_name":"CC_TIMETABLE_MGR","priv_num":1024,"enabled":0}]

最佳答案

是的,内部 queryAndWait 将针对每一行独立运行,因为您没有链接 promise 。

因为你使用 bluebird,所以你需要这样的东西来维持流程

queryAndWait(query + '; ' + queryFoundRows, params).then(function (result) {
    return Promise.map(result[0], function (row) {
        var site_access = [];
        var module_access = [];

        var sites = row.site_access.split(',');
        _.each(sites, function (site_id) {
            site_access.push(site_id);
        });

        row.site_access = site_access;

        return queryAndWait(queryModules, [row.priv_id]).then(function (result) {
            _.each(result, function (module) {
                var modulePriv = {
                    priv_name: module.priv_name,
                    priv_num: module.priv_num,
                    enabled: module.enabled
                };

                module_access.push(modulePriv);
            });
            row.module_access = module_access;
            return row;
        });
    });
}).then(function(payload) {
    console.log(payload);
}).catch(function(error) {
    console.log(error);
});

关于javascript - 使用 Node (ES6)和 Bluebird promise 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32735500/

相关文章:

javascript - Bluebird promises - 嵌套与拒绝模式

javascript - 无法使用 d3 创建曼哈顿图

JavaScript 设置和获取 cookie?

javascript - 在 facebook 上分享链接,如何重新初始化 fb obj

javascript - 从 webpack 中剥离动态需求

javascript - 对 promise 感到困惑

javascript - Parse.com JQuery 检查数组值是否在解析字段中

node.js - 我如何在 node js sequelize 中编写此查询

html - 从 Node 服务器提供 HTML 文件

javascript - .then()方法返回的promise中 promise 了什么?