0

我有类似的数据库数组

const dbArr = ["http://localhost:5984", "http://xyz_couchdb.com:5984"]

要插入的数据

let data ={
            _id: 324567,
            name: Harry,
            gerder: male
        }

这是我使用纳米模块的逻辑

        return new Promise((resolve, reject) => {

            let res = [];
            let rej = [];
            let counter = 0;

            for(let i = 0; i < dbArr.length ; i++){
                dbArr[i].insert(data, (err, body) => {
                    err ? rej.push(err) : res.push(body)
                    if(counter === obj.dbArray.length -1){
                        rej.length ? reject(rej) : resolve(res)
                    }
                    counter++;
                })
            }
        })

使用 promise 或 async 模块或任何东西来实现这一目标的最佳方法是什么。

4

1 回答 1

0

在下面的示例中,我们必须使用为 的每个元素Array.map创建一个,然后我们必须使用 Promise.all 等待 all 结束。这是在这里,所以我们处理错误。promisedbArrpromisescatch

function getAll(dbArr) {
  return Promise.all(dbArr.map(x => x.insert(data)));
}

getAll(dbArr)
  .then((rets) => {
    // Handle the returns
    // They are in an array
  })
  .catch((err) => {
    // Handle the error
  });

编辑

好的,在查看了node-couchdb的文档(我想你使用的那个)之后 - 我看到该.insert()方法不返回一个Promise而只返回一个回调。

所以我们必须转换方法,所以它会返回一个 Promise 使用util.Promisify()

const {
   promisify,
} = require('util');

function getAll(dbArr) {
  return Promise.all(dbArr.map(x => promisify(x.insert)(data)));
}

getAll(dbArr)
  .then((rets) => {
    // Handle the returns
    // They are in an array
  })
  .catch((err) => {
    // Handle the error
  });
于 2018-05-28T18:11:38.560 回答