承诺模式 - 使用Promise.all()

时间:2015-11-02 13:27:56

标签: javascript ecmascript-6 es6-promise

我有一系列函数用于获取一些JSON数据,然后将数据插入数据库。我想等待所有插入完成,所以我尝试使用Promise.all()。我知道Promise.all()需要一个数组(或可迭代的)承诺。

这是我的链条:

fetchBody().then(parseBody).then(prepareInserts).then(insertAll).then(function() {
    console.log('done')
}); // Error handling and more stuff here

我的代码挂在prepareInserts函数上:

// Returns an array of promises, which will be iterated over in Promise.all();
const prepareInserts = function (data) {
    return new Promise(function (resolve, reject) {
        const promises = data.map(function (d) {
            return new Promise(function (resolve, reject) {
                connection.query(queryString, [d.a, d.b, d.c, d.d], function (error) {
                    if (error) {
                        reject(error);
                        return;
                    }
                    resolve();
                });
            });
        });
        resolve(promises);
    });
};

我认为我对如何布置prepareInserts功能有一个根本的误解;那里的查询正在执行,这不是我想要的。我希望它们插入到链中的最后一个函数中:

const insertAll = function (promises) {
    return Promise.all(promises);
};

1 个答案:

答案 0 :(得分:2)

我认为这就是你想要的:

const doInserts = data => {
  return Promise.all(data.map(d => 
     new Promise((resolve, reject) => {
       connection.query(queryString, [d.a, d.b, d.c, d.d], error => {
         if (error) {
           reject(error);
           return;
         }
         resolve(/* to what?? */);
       });
     }));
  });
};

fetchBody().then(parseBody).then(doInserts).then(function() {
  console.log('done')
});

所有 内部承诺得到解决时(没有值?),您会返回Promise.all()承诺解析。每个内部承诺都是通过将数据项(从data)映射到承诺来创建的,该承诺根据查询结果被解析或拒绝。

如果您可以在此代码之外宣传 connection.query,那么可以获得更清晰的结果,直接映射到“promisifiedQuery”。