Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise捕获Promise结构中的结果_Javascript_Node.js_Promise_Angular Promise - Fatal编程技术网

Javascript Promise捕获Promise结构中的结果

Javascript Promise捕获Promise结构中的结果,javascript,node.js,promise,angular-promise,Javascript,Node.js,Promise,Angular Promise,这是我的全部代码,如果可能的话,我想避免使用所有moveAllBank、moveAllReceipt和moveAllExpense函数。下面的代码工作得很好,我只是希望有一个更聪明的方法来做。很难理解不同的承诺是如何相互传递数据的 // // Find all bank accounts // var bankModel = require('../models/bankModel'); var bankTable = mongoose.model('bankModel'); var ban

这是我的全部代码,如果可能的话,我想避免使用所有moveAllBank、moveAllReceipt和moveAllExpense函数。下面的代码工作得很好,我只是希望有一个更聪明的方法来做。很难理解不同的承诺是如何相互传递数据的

// 
// 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})
    });
你想要

findBank
  .then(bank => findAllReceipts(bank)
    .then(receipt => bank.findAllExpense(bank)
      .then(expense =>
        res.json({error:false, bank, receipt, expense})
      )
    )
  )
  .catch(err => res.json({error:true,err});
或者只是

try {
  const bank = await findBank;
  const receipt = await findAllReceipts(bank);
  const expense = await findAllExpense(bank);
  res.json({error: false, bank, receipt, expense});
} catch(error) {
  res.json({error});
}

要使用
wait
,当然必须将函数标记为
async

您的意思是
。然后(()=>res.json
。然后(()=>bankArray)
这就是你所说的torazaburo吗?每个then方法都有相同的签名,你需要传递函数。你的
then
代码确实应该是一个函数-只需使用
data=>bankData=data
方法注册一个匿名函数即可inline@OvidiuDolha我试过了,但没有结果。即使你,这个函数也运行得很完美在实际生成数据时,数组中没有放入任何
。然后(expenseArray=>findAllExpense(bankArray))
它们都不起作用-在第一个示例中,只有findBank()生成结果,其他的都不起作用。然后是工作。在第二个示例中,所有Wait都在Wait函数()中给出错误
SyntaxError:Unexpected identifier
@torbenrudgaard为此,您需要使函数
async
,并可能在transpiler中启用该功能。但是,代码段是等效的,因此如果一个代码段不起作用,那么另一个代码段也不会起作用。@Bergi在这种情况下,我更喜欢promise结构。但是,如何获得结果呢来自承诺的t以及如何将结果发送到承诺?这是我这里最大的问题。我知道承诺默认情况下会将结果发送给彼此,但您可以更改它并发送其他内容吗?@torbenrudgaard promises会将其结果发送到其回调。请不要将承诺与创建它们的函数混淆。以及您如何使用承诺您的回调函数中的参数完全是您的选择。@Bergi我读了另一篇文章(将我的替换为副本的文章),您给出了一些很好的示例和信息。您就像promises的教父:-),但我对异步编程还是相当陌生,所以我仍然无法理解如何实现您的建议。我更新了我的问题,把所有的代码和我的问题重新措辞。