nodejs承诺数组,我该怎么做?

时间:2017-05-18 07:23:23

标签: javascript node.js

我对异步编程很新,以前从未做过承诺队列,所以我不知道如何解决这个问题。

我有一张银行账户表

每个银行帐户我都有收据清单

Account 111
 - Receipt 001
 - Receipt 002
 - Receipt 003

Account 222
 - Receipt 004
 - Receipt 005
 - Receipt 006

所以我建立了一个承诺,找到()所有的银行账户。

然后我循环通过所有银行账户,并为每个账户找到所有收据。

我该怎么办?为每个收据find()创建一个承诺?

创建一系列承诺? (你怎么做btw)

或者有第三种选择吗?

// 
// Find all bank accounts
// 
var findBank = new Promise(
    (resolve, reject) => {
    bankTable.find({}
    ,function(err, data) {
        if (!err) {
            resolve(data);
        } else {
            reject(new Error('findBank ERROR : ' + err));
        }
    });
});


// 
// Find the RECEIPTS for each bank account
// 
var findAllReceipts = function(accountArray) {

    for (var i=0; i<accountArray.length; i++) {

        var findReceipt = new Promise(
            (resolve, reject) => {
            receiptTable.find(
                { accountNo: accountArray[i].accountNo } 
            ,function(err, data) {
                if (!err) {
                    resolve(data);
                } else {
                    reject(new Error('findPrice ERROR : ' + err));
                }
            });
        });
    }
}

// 
// Run the promises
// 
findBank
    .then(findAllReceipts)
    .catch(err => {
        console.log("getbankAccountReport ERR: " + err);
        res.json({error:true,err})
    })

1 个答案:

答案 0 :(得分:8)

以下是如何做到这一点:

let findAllReceipts = function (accountArray) {
    const a = [];

    for (let i = 0; i < accountArray.length; i++) {
        a.push(new Promise((resolve, reject) => {
            receiptTable.find({accountNo: accountArray[i].accountNo}, function (err, data) {
                if (!err) {
                    resolve(data);
                } else {
                    reject(new Error('findPrice ERROR : ' + err));
                }
            });
        }));
    }

    return Promise.all(a);
};

或者这种方式使用该语言的所有功能:

let findAllReceipts = function (accountArray) {
    return Promise.all(accountArray.map(findReceipts));
};

function findReceipts(account) {
    return new Promise((resolve, reject) => {
        receiptTable.find({accountNo: account.accountNo}, function (err, data) {
            if (!err) {
                resolve(data);
            } else {
                reject(new Error('findPrice ERROR : ' + err));
            }
        });
    });
}