【发布时间】:2018-07-24 22:44:55
【问题描述】:
我正在研究 Promsies 和 async/await 的用法。
我编写了以下代码,它执行以下操作:
- 它获取一些数据库的数据(使用 Knex.js),
- 处理该数据,
- 将处理的数据分配给指定的属性。
这 3 个步骤被多次执行(在下面的代码中,它被执行了两次),并且总是awaited:
async function run() {
return await getData();
}
async function getData() {
let handledData = {};
handledData.res1 = await knex.select('column1').from('table1').where('column1', '1')
.then(data => handleData(data))
.catch(handleError);
handledData.res2 = await knex.select('column1').from('table1').where('column1', '2')
.then(data => handleData(data, handledData))
.catch(handleError);
return handledData;
}
async function handleData(data) {
let res = [];
data.forEach(item => {
res.push(item.column1);
});
return res;
}
function handleError (error) {
console.log(error);
}
现在,我正在尝试编写与 getData 等效的承诺链,这就是我想出的:
async function getData() {
let handledData = {};
let promise = new Promise(function(resolve, error){ resolve(); });
promise
.then(function () {
return knex.select('column1').from('table1').where('column1', '1')
.then(data => handleData(data))
.catch(handleError);
})
.then(function(handled){
handledData.res1 = handled;
return knex.select('column1').from('table1').where('column1', '2')
.then(data => handleData(data))
.catch(handleError);
})
.then(function(handled){
handledData.res2 = handled;
return handledData;
})
.catch(handleError);
return promise;
}
但这并不完全奏效。发生的情况是,在第一个 then 返回后,run 内部的 await 结束等待,这导致 run 返回 - 然后才执行第二个 then。
如何使 promise-chaining 版本像多等待版本一样工作?
(请随时指出我对 promises/async-await 的任何误解)
【问题讨论】:
-
您是否需要使用
await或顺序请求?使用Promise.all可能会更好(并行请求,而不是串行请求) -
@CertainPerformance,这是个好主意,我会这样做
标签: javascript ecmascript-6 promise async-await chaining