javascript-保持承诺链可读
作者:互联网
我已经习惯于承诺链接数组.当每个承诺都是一行这样的长行时,阅读一个承诺链非常容易
myArray.map(x => convertX)
.filter()
.whatever()
.etc()
这是非常容易阅读的.但是,当我使用自定义函数创建承诺链时,它会变得更加混乱.
database.query(first query)
.then(results => {
// do stuff
// do more
// even more
return database.query(second query)
})
.then(results => {
// rinse and repeat
})
.catch(err => {
// error handling
})
现在,这很容易理解,但是当承诺链进一步延伸时,它会变得有点多.如果我每个承诺都是它自己的功能,那么我可以简化流程,使代码看起来像这样(它的imo可读性提高了1000倍).
db.query(first query)
.then(storeFirstQuery)
.then(secondQueryAndStoreIt)
.then(thirdQueryAndStoreIt)
.catch(errHandlingFunction)
这样,我可以重新排列函数,而不必操纵从一个承诺传递到下一个承诺的值.如果一个承诺使用另一个的结果,则只需要在另一个的后面,而不是紧接在后面.这样,我可以在任何需要的地方偷偷答应.
但是,这需要我的诺言链在每个诺言的范围之外使用变量.有没有一种尝试过的,真正的方法来做到这一点?
编辑-似乎异步/等待是执行此操作的最佳方法,但是我在Heroku上运行Node,但尚不支持它:/
解决方法:
好吧,您可以使用带有promise的东西:
myArray.map(x => convertX)
.filter()
.whatever()
.etc()
如果使用npm的rsp模块.
除此之外,您可以使用ES2017的async / await功能来简化承诺链,尤其是其范围.
因为使用这样的代码:
db.query(first query)
.then(storeFirstQuery)
.then(secondQueryAndStoreIt)
.then(thirdQueryAndStoreIt)
.catch(errHandlingFunction)
如果您需要在最后的thirdQueryAndStoreIt()处理函数中使用第一个查询的结果,则访问超出范围的数据时会遇到问题.但是当您这样做时:
try {
let a = await db.query(first query);
let b = await storeFirstQuery();
let c = await secondQueryAndStoreIt();
let d = await thirdQueryAndStoreIt(a); // use 'a' here
} catch (e) {
errHandlingFunction(e);
}
那么您就不会遇到范围问题,因为您可以轻松访问所有先前分配的变量.
请参阅此以获取支持以下语法的节点版本:
> http://node.green/#ES2017-features-async-functions
您可以将其与开箱即用的Node v7.6或带有–harmony标志的Node v7.0一起使用.
对于较旧的Node版本,可以使用生成器函数和yield来使用co或Bluebird.coroutine进行类似的语法处理,而不必等待.
标签:javascript,node-js,es6-promise 来源: https://codeday.me/bug/20191013/1906960.html