到目前为止,我下面的API中间件代码都能正常工作。 我真的想确保快速服务器中没有任何阻塞呼叫。 因此,我还制作了包含异步获取功能的函数。
我的问题是,那根本有必要吗?因为实际上第一次等待应该已经解除对我的快递服务器的阻止,对吗?
代码如下:
var express = require('express')
var router = express.Router()
const asyncMiddleware = require('./utils/asyncMiddleware');
async function fetchCall(URL, bodyJson, wpToken) {
try {
return await fetch(URL, {
method: "POST",
credentials: "same-origin",
headers: {
"Authorization": "Bearer " + wpToken,
"Content-Type": "application/json",
"Accept": "application/json"
},
body: bodyJson
});
} catch (error) {
return {status:544, error:error};
}
}
router.post("/registerVendor", asyncMiddleware(async (req, res, next) => {
const response = await fetchCall(myApiUrl, req.body, 1)
return res
.status(response.status)
.send({ data: response});
}));
module.exports = router
答案 0 :(得分:2)
如果问题是,您是否必须将fetch
放在单独的async
函数中,答案是否定的,您没有。它可能有用,但您没有。如您所说,如果您直接等待fetch
承诺,则将结束async
路由回调的同步部分。
我的问题是,此函数(在我的代码示例中为“ fetchCall”)是否必须异步。
不,不是。它甚至不必返回承诺,因为您可以await
任何值。例如,以下日志按顺序记录A,B,C,D和E:
async function foo() {
console.log("B");
await 42;
console.log("D");
}
console.log("A");
foo()
.then(() => {
console.log("E");
})
.catch(error => {
console.error(error);
});
console.log("C");
当然,您要返回承诺。 :-)这将起作用:
function fetchCall(URL, bodyJson, wpToken) {
return fetch(URL, {
method: "POST",
credentials: "same-origin",
headers: {
"Authorization": "Bearer " + wpToken,
"Content-Type": "application/json",
"Accept": "application/json"
},
body: bodyJson
})
.catch(error => ({status:544, error:error}));
}
也就是说,async
/ await
的优点在于,它使我们可以从同步代码中熟悉的分支和循环结构中编写异步代码...