【发布时间】:2018-11-27 00:25:11
【问题描述】:
我有一个返回 promise 的函数,如下所示:
let aFunction= function(){
return new Promise((resolve, reject){
someNodeApi(params, function(err, data)) {
if(err) {
return reject(err);
}
if(data meets certain criteria) {
someOtherNodeApi(params, function(err, data)) {
// handle conditions.
}
}
resolve(data);
}
})
}
我想要一个async 函数等价于这种函数。简而言之,我需要这样的东西:
let aFunction = async function(){
someNodeApi(params, function(err, data){
if(err) {
// reject condition
}
// resolve condition.
})
}
那么reject 和resolve 上面的条件应该是什么,以便我调用函数的所有地方都像这样:
aFunction()
.then(data=>{})
.catch(err=>{})
应该是不变的。
编辑
我必须澄清一下,我的问题不是关于如何调用异步函数。但它是关于如何转换一个返回 Promise 的函数,以便能够使用 async-await 模式的优点,而无需修改其调用方式。 (处理预 async-await 时代节点 js 代码时非常常见的场景)。
【问题讨论】:
-
你的前提是错误的。异步函数的调用方式不同 (
var result = await foo())。如果你想保持then catch模式,你需要继续使用 Promise。这让我想到了一个重要的问题:为什么你想摆脱承诺? -
@ChrisG 我想摆脱承诺,原因与为什么将 async-await 添加到节点 js 中的原因相同。这是一种更好的方式,更像是同步编程。
-
编辑后,您的问题似乎也是。我如何承诺一个 api,或者我如何使用 async/await。如果是第一个,请使用库。如果是第二个,请阅读文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
-
@MattWay 本质上是一个异步函数返回一个 Promise。因此,以某种方式使用 async/await 成为选择和意见的问题。所以我不认为我的问题是关于如何使用它。
-
如果你的问题是
how to convert a function that returns a Promise to be able to use the goodness of async-await pattern without having to modify the way its called,那么据我所知,答案是“你不能”。另外,据我从您的 cmets 收集到的信息,您确实在询问如何使用 async / await 因为如果您知道,这个问题就不存在了。essentially an async function returns a Promise不,它没有。
标签: javascript node.js promise async-await