NodeJS Promises 无法编辑现有 'model'

NodeJS Promises can't edit existing 'model'

编辑 仔细检查后,似乎 async.forEachgetCurrencies 甚至 运行 第一次完成之前完成...我该如何解决这个问题?我认为返回一个 promise 基本上 'chain' 这些 promise 在一起?

我有以下代码,它试图从 mysql 读取交易。由于 table 的大小和查询所需的时间长度,我将其分解并使用 promises 来填充对象。但是,getCurrencies 不会更新模型的 currencyCode - 然而,console.log 都报告了正确的值。有人可以解释我做错了什么吗?我对承诺还很陌生。谢谢。

主要对象建筑

    connection.query(query).then(function(items) {
        async.forEach(items, function(element) {
            element.ptype = 'merchants';
            element.type = 'transactions';
            element.currencyCode = null;

            getCurrencies(element.currencies_id).then(function(result) {
                console.log(result.currencyCode);
                element.currencyCode = result.currencyCode;
                console.log(JSON.stringify(element));
            });
        });

        res.send(items);
    });

获取货币

function getCurrencies(transactionId) {
    var currencies_query = '';
    currencies_query += 'SELECT ';
    currencies_query += 'iso_code AS currencyCode, ';
    currencies_query += 'name AS `currencyName`, ';
    currencies_query += 'symbol AS `currencySymbol`, ';
    currencies_query += 'exponent AS `currencyExponent`, ';
    currencies_query += 'iso_num AS `currencyNumber` ';
    currencies_query += 'FROM ';
    currencies_query += 'currencies ';
    currencies_query += 'WHERE ';
    currencies_query += 'id = ' + transactionId;

    return new Promise(function(resolve, reject) {
        connection.query(currencies_query).then(function(rows) {
            resolve(rows[0]);
        });
    });
};

console.logs

的输出

GBP

{"id":11213595,"pid":100856,"uri":"/rest/transactions/11213595","puri":"/rest/merchants/100856","path":"/resellers/1/customers/5/merchants/100856/transactions/11213595","transactionID":11213595,"currencies_id":1,"transactionUri":"/rest/transactions/11213595","ptype":"merchants","type":"transactions","currencyCode":"GBP"}

来自邮递员的 api 响应

{
    "id": 11213615,
    "pid": 103845,
    "uri": "/rest/transactions/11213615",
    "puri": "/rest/merchants/103845",
    "path": "/resellers/1/customers/2368/merchants/103845/transactions/11213615",
    "transactionID": 11213615,
    "currencies_id": 1,
    "transactionUri": "/rest/transactions/11213615",
    "ptype": "merchants",
    "type": "transactions",
    "currencyCode": null
  }

如您所见,currencyCode 仍然是 null - 为什么?! :(

As you can see, currencyCode is still null - Why?! :(

我之前没有使用 "async.forEach",但我认为 currencyCode 是 Null - 因为你调用了 promise "getCurrencies",异步工作

如果您需要用很少的承诺来响应客户 - 您必须收集承诺到数组,然后调用 Promise.all(这将 return 所有承诺的结果数组)

并且您应该在下一个链块中发送响应。 我认为它应该有效

connection.query(query)
.then(function(items) {
    var arPromises = [];
    async.forEach(items, function(element) {
        element.ptype = 'merchants';
        element.type = 'transactions';
        element.currencyCode = null;
        arPromises.push(
            new Promise(function (resolve, reject) {
                getCurrencies(element.currencies_id)
                    .then(function(result) {
                        element.currencyCode = result.currencyCode;
                        resolve(element);
                    }).catch(function (error) {
                        //do something with error
                        if(error)
                           reject(error);
                    });
            })
        );
    });
    return Promise.all(arPromises);
}).then(function(items){
    res.send(items);
}).catch(function (error) {
    if(error)
     console.log(error);
});

我的建议是,用 "catch" 块结束链 - 以避免丢失错误