【问题标题】:Render result from promises.all in a view, nodeJS在视图中渲染 promises.all 的结果,nodeJS
【发布时间】:2020-05-19 17:12:50
【问题描述】:

已修复:<%- locals.devices -%>

所以,正如标题中所说,我想要实现的是发送一个来自 promises 的 json 对象数组。

const switch_p = new Promise(function (resolve, reject) {
            conn.query('SELECT * FROM switch', (err, switch_data) => {
                if (err) throw err;
                resolve(switch_data);
            });
        });

const ap_p = new Promise etc..
             ...
             ...
             resolve(ap_data);


const server_p = new Promise etc..
             ...
             ...
             resolve(server_data);


const router_p = new Promise etc..
             ...
             ...
             resolve(router_data);

这是我想从中获取价值并在之后呈现它们的 4 个承诺。

Promises.all 函数:-我尝试了更多渲染值的案例,但每次都没有成功。 这是最后一次尝试:

Promise.all([switch_p, ap_p, server_p, router_p]).then(values => {

            const responses = values.map(response => values)
            return Promise.all(responses)
        }).then(responses => {
            console.log(responses);
            data = responses
            console.log(data); // here its shows that data has content
            res.render('admin-panel', {
                layout: 'layoutAdmin',
                locals: {_id: sess_id, uname: sess_uname, rol: sess_rol, devices: data}
            });
        });

鉴于我只是尝试显示来自设备 () 的内容,我知道它会是这样的:

[ [ [Object],
      [Object],
      [Object],
      ........

但它说“设备未定义”..我不知道为什么。 此外,如果有一个解决方案可以在不破坏多个函数中的代码的情况下做到这一点,那将是很酷的。

>>>>>>>>>>>>

让我们暂时忘记 ap_p 承诺。

这是 Promise 函数:

       const switch_p = new Promise(function (resolve, reject) {
            conn.query('SELECT * FROM switch', (err, switch_data) => {
                if (err) reject(err)
                else resolve(switch_data);
            });
        });

       const server_p = new Promise(function (resolve, reject) {
            conn.query('SELECT * FROM server', (err, server_data) => {
                if (err) reject(err)
                else resolve(server_data);
            });
        });

      const router_p = new Promise(function (resolve, reject) {
            conn.query('SELECT * FROM router', (err, router_data) => {
                if (err) reject(err)
                else resolve(router_data);
            });
        });

promise all 函数,虽然我不知道我是否以一种好的方式处理了错误..

Promise.all([switch_p, server_p, router_p]).then(responses => {
            console.log(responses);
            res.render('admin-panel', {
                'layout': 'layoutAdmin',
                'locals': {'_id': sess_id, 'uname': sess_uname, 'rol': sess_rol, 'devices': responses}
            });

        })
            .catch(function (error) {
                console.log(error);
                throw (error);
            });

console.log(responses) 工作正常,我得到的单个错误仍然是“未定义设备”。

【问题讨论】:

  • if (err) reject(err);替换if (err) throw err;
  • const responses = values.map(response => values) return Promise.all(responses) 对我来说没有任何意义。你想在哪里实现呢?
  • 什么是conn.query?它已经返回承诺的可能性很高。
  • @Bergi 我第一次尝试像 Roamer 那样做,我的意思是直接从 promise.all 渲染值,但没有成功,所以我尝试将渲染函数放入 promise (以避免异步执行)。 //// conn是我的mysql连接,query只是我从表中获取数据的函数。

标签: javascript node.js promise


【解决方案1】:

在创建 Promise 的地方,throw 没有达到预期的效果。必须调用reject()

替换...

`if (err) throw err`; 

与...

if (err) reject(err)

Promsie.all() 链中,

  • 清除第一个.then(...)
  • 在第二个.then() 中,清除data = responses; 并使用responses
  • 添加一个.catch() 处理程序。

你应该以 ...

const switch_p = new Promise(function (resolve, reject) {
    conn.query('SELECT * FROM switch', (err, switch_data) => {
        if (err) reject(err)
        else resolve(switch_data);
    });
});

// etc.

和...

Promise.all([switch_p, ap_p, server_p, router_p])
.then(responses => {
    console.log(responses);
    res.render('admin-panel', {
        'layout': 'layoutAdmin',
        'locals': { '_id': sess_id, 'uname': sess_uname, 'rol': sess_rol, 'devices': responses }
    });
})
.catch(function(error) {
    // Handle error here.
    // Either return a value (to put promise chain back on the success path) ...
    // ... or throw/rethrow error (to continue on the error path)
});

【讨论】:

  • 谢谢,但还是没有成功...我用新方法编辑了我的原始帖子。
  • 建议您进行测试以检查 Bergi 关于 conn.query() 已经返回 Promise 的观点。如果是这样,则将三个 promise 创建修改为例如 const xxx_p = conn.query('SELECT * FROM xxx');,省略回调。
  • 不幸的是,它似乎不起作用,据我所知,查询函数不会返回承诺。我的意思是我在 connection_name.query() 中看到了多个带有 Promise 的实现。但感谢 Roamer 和 Bergi 的意见。
【解决方案2】:

所以,我发现了问题所在。我应该渲染 ... 是的,我犯了一个愚蠢的错误。谢谢你的暗示。

【讨论】:

  • 虽然它实际上并没有解决问题,但使用我的代码应该没有什么坏处......与你的``修复。
  • 不是。您的代码更简单且工作正常,并感谢您提供拒绝错误信息。老实说,你的实现是我第一次尝试(除了reject err的东西),但是因为我没有发现错误我认为原因可能是函数的异步执行,所以我创建了一个promise。
  • 也许你可以用你的 `` 修复来编辑我的答案,以防将来让人们感到困惑。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2015-12-26
  • 1970-01-01
相关资源
最近更新 更多