【发布时间】:2018-02-09 18:25:24
【问题描述】:
我有一个名为 GetAllData() 的函数,它调用 GetPurchaseData,它递归地调用自身,直到它加载所有数据。在
async function GetAllData(){
console.log("starting loading purchase data");
await GetPurchaseData();
console.log("purchase data loaded")
}
async function GetPurchaseData(){
return new Promise(async function (resolve,reject){
var Headers = {
....
}
await request({url: xxx, headers: Headers },async function(error, response, body) {
var tmp = JSON.parse(body)
_.forEach(tmp.Purchases, p => purchaseData.push(p));
if (response.headers.pagination){
return await GetPurchasePaginatedData()
}
else{
console.log("done loading....")
return resolve("done")
}
});
})
}
Node JS 打印以下输出:
starting loading purchase data
done loading....
但它永远不会返回到 GetAllData 来打印
已加载购买数据
它几乎看起来像是卡在了函数中,但我认为“return resolve(“done”)”这一行并没有回到最初的调用,以实际将 Promise 标记为完成。
【问题讨论】:
-
需要注意的是,您不需要从
async function显式返回Promise,async规定您的函数无论如何都将返回Promise。 -
另外,
request接受Promise还是回调?上次我使用它时,它希望以标准 node.js 方式进行回调。如果是这种情况,您需要包装request或找到在Promises中工作的库。 -
我正在通过 return new Promise( ... request() ... ) 包装请求,我不是吗?
-
您使用的是哪个确切请求库?如果它是常规的,它只适用于你没有正确包装的回调。由于您正在使用
Promises和async/await,我实际上建议使用request提供的包装库之一。你可以选择request's GitHub中的任何一个。 -
@zero298 哈哈!!有趣的!我正在使用常规请求库。你能发布一个正确包装方式的例子吗?
标签: javascript node.js express asynchronous recursion