NodeJS Promises 无法编辑现有 'model'
NodeJS Promises can't edit existing 'model'
编辑
仔细检查后,似乎 async.forEach
在 getCurrencies
甚至 运行 第一次完成之前完成...我该如何解决这个问题?我认为返回一个 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.log
s
的输出
先
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" 块结束链 - 以避免丢失错误
编辑
仔细检查后,似乎 async.forEach
在 getCurrencies
甚至 运行 第一次完成之前完成...我该如何解决这个问题?我认为返回一个 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.log
s
先
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" 块结束链 - 以避免丢失错误