【问题标题】:Promise catching the results inside the promise structure [duplicate]承诺在承诺结构中捕获结果[重复]
【发布时间】: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


【解决方案1】:

你想要

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});
}

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

【讨论】:

  • 它们都不起作用 - 在您的第一个示例中,只有 findBank() 产生结果,其他 .then 都不起作用。在第二个示例中,所有 await 都会在 await function(); 处给出错误; SyntaxError: Unexpected identifier
  • @torbenrudgaard 您需要为此创建函数async,并可能在您的转译器中启用该功能。然而,sn-ps 是等价的,所以如果一个不能工作,那么另一个也不能工作。
  • @Bergi 在这种情况下,我更喜欢 promise 结构。但是你如何从一个 Promise 中得到结果以及如何将结果发送给 Promise?这是我在这里最大的问题。我知道 Promise 默认会互相发送结果,但你能改变它并发送其他东西吗?
  • @torbenrudgaard 承诺将他们的结果发送到他们的 回调。请不要混淆创建它们的函数的承诺。而你对回调函数中的参数做什么完全是你的选择。
  • @Bergi 我阅读了另一篇文章(将我的替换为重复的文章),您提供了一些很好的示例和信息。你就像 Promise 的教父 :-)) 但我对异步编程还是很陌生,所以我仍然无法理解如何实现你的建议。我更新了我的问题并输入了所有代码并重新表述了我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2017-11-29
  • 2016-12-05
  • 2017-08-04
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多