【发布时间】:2017-10-18 08:33:39
【问题描述】:
这是我的全部代码,如果可能的话,我想避免所有 moveAllBank、moveAllReceipt moveAllExpense 函数。下面的代码工作正常,我只是希望有一种更聪明的方法。很难理解不同的 Promise 是如何在彼此之间传递数据的。
//
// Find all bank accounts
//
var bankModel = require('../models/bankModel');
var bankTable = mongoose.model('bankModel');
var bankArray = [];
var findAllBank = new Promise(
(resolve, reject) => {
bankTable.find({}
,function(err, data) {
if (!err) {
resolve(data);
} else {
reject(new Error('findBank ERROR : ' + err));
}
});
});
let moveAllBank = function (data) {
bankArray = data;
console.log("receiptArray Result: " + JSON.stringify(data, null, 4));
};
//
// Find the RECEIPT for each bank account
//
var receiptModel = require('../models/receiptModel');
var receiptTable = mongoose.model('receiptModel');
var receiptArray = [];
let findAllReceipts = function (accountArray) {
return Promise.all(bankArray.map(findReceipts));
};
function findReceipts(account) {
return new Promise((resolve, reject) => {
receiptTable.find({account: account._id}, function (err, data) {
if (!err) {
console.log("findReceipts Result: " + JSON.stringify(data, null, 4));
resolve(data);
} else {
reject(new Error('findReceipts ERROR : ' + err));
}
});
});
}
let moveAllReceipt = function (data) {
receiptArray = data;
console.log("receiptArray Result: " + JSON.stringify(data, null, 4));
};
//
// Find the EXPENSE for each bank account
//
var expenseModel = require('../models/expenseModel');
var expenseTable = mongoose.model('expenseModel');
var expenseArray = [];
let findAllExpense = function (accountArray) {
console.log("=====EXPENSE====")
console.log("accountArray Result: " + JSON.stringify(accountArray, null, 4));
return Promise.all(bankArray.map(findExpense));
};
function findExpense(account) {
return new Promise((resolve, reject) => {
expenseTable.find({account: account._id}, function (err, data) {
if (!err) {
console.log("findExpense Result: " + JSON.stringify(data, null, 4));
resolve(data);
} else {
reject(new Error('findExpense ERROR : ' + err));
}
});
});
}
let moveAllExpense = function (data) {
expenseArray = data;
console.log("expenseArray Result: " + JSON.stringify(data, null, 4));
};
//
// Send the result
//
let sendResult = function (data) {
res.json({error:false, "bank":bankArray, "receipt":receiptArray, "expense":expenseArray})
};
//
// Run the promises
//
findAllBank
.then(moveAllBank)
.then(findAllReceipt)
.then(moveAllReceipt)
.then(findAllExpense)
.then(moveAllExpense)
.then(sendResult)
.catch(err => {
console.error(err);
console.log("getbankAccountReport ERR: " + err);
res.json({error:true,err})
});
【问题讨论】:
-
你的意思是
.then(() => res.json? -
.then(() =>bankArray)是你的意思 torazaburo 吗? -
每个 then 方法都有相同的签名,你需要给它传递函数。
-
您的
then代码确实应该是一个函数 - 只需使用data => bankData = data方法内联注册一个匿名函数 -
@OvidiuDolha 我试过了,但没有结果。即使你的函数运行完美并实际产生数据,
.then(expenseArray => findAllExpense(bankArray))也没有放入数组中
标签: javascript node.js promise angular-promise