作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 async await 并且我的 await 从未解析,所以下一行根本没有执行。我的意思是这一行:
result = await IndexingStatusResult(req, res);
在下面的代码中:
router.post(
"/api/result-store/v1/indexing-analyzer/:searchID/:id",
async (req, res) => {
console.log("Indexing started");
var hrstart = process.hrtime();
let result = null;
result = await IndexingStatusResult(req, res);
console.log("result is: ", result.data);
hrend = process.hrtime(hrstart);
console.info("Execution time (hr): %ds %dms", hrend[0], hrend[1] / 1000000);
res.status(200).send({
indexingTimeSec: hrend[0],
indexingTimeMillSec: hrend[1] / 1000000
});
}
);
但是正如您在 IndexingStatusResult 中看到的那样,当一切都完成时我返回一个 promise :
const IndexingStatusResult = async (req, res) => {
const docID = parseInt(req.params.id) * 1000;
const dbName = "test_" + req.params.searchID;
let result = null;
try {
result = await axios(
`${params.HOST_NAME_WITH_PROTOCOL}/${dbName}/_design/searchAll/_search_info/searchAll`
);
result = result.data;
console.log(
"Number of docs indexed:",
result.search_index.doc_count,
"Total Docs needs to be indexed:",
docID
);
} catch (e) {
console.log(e);
}
console.log(`result returned is : ${JSON.stringify(result)}`);
if (!result || parseInt(result.search_index.doc_count) < docID) {
return Promise.resolve(
setTimeout(() => {
console.log("WWWWWAAAAIIIIIITING");
IndexingStatusResult(req, res);
}, 5000)
);
} else {
console.log("YAAAAAAYYYYYYYYYYYYY");
return Promise.resolve(result);
}
};
这是我看到的:
Example app listening on port 3005!
Indexing started
Number of docs indexed: 0 Total Docs needs to be indexed: 5000
result returned is : {"name":"_design/searchAll/searchAll","search_index":{"pending_seq":0,"doc_del_count":0,"doc_count":0,"disk_size":0,"committed_seq":0}}
result is: undefined
Execution time (hr): 0s 314.964402ms
WWWWWAAAAIIIIIITING
Number of docs indexed: 0 Total Docs needs to be indexed: 5000
result returned is : {"name":"_design/searchAll/searchAll","search_index":{"pending_seq":0,"doc_del_count":0,"doc_count":0,"disk_size":0,"committed_seq":0}}
WWWWWAAAAIIIIIITING
Number of docs indexed: 5001 Total Docs needs to be indexed: 5000
result returned is : {"name":"_design/searchAll/searchAll","search_index":{"pending_seq":5001,"doc_del_count":0,"doc_count":5001,"disk_size":797698,"committed_seq":0}}
YAAAAAAYYYYYYYYYYYYY
所以下面这行永远不会被执行:
console.log("result is: ", result.data);
我做错了什么吗?
最佳答案
几个问题:
IndexingStatusResult
中看到的那样,当一切都完成时,我会做出 promise ”。此声明显示了一个误解:An async
函数返回一个 promise 同步,而不是在“一切”(异步)完成时。console.log("result is: ", result.date)
确实被执行,但它是触发错误的那个。setTimeout
在IndexingStatusResult
不会延迟它返回的 promise 的解决时刻。在调用 setTimeout
之后您什么都不做(在编辑中,您在此处显式返回), promise 以 undefined
实现.现阶段setTimeout
回调尚未执行。 undefined
分辨率值解释了您遇到的错误。result = result.data
,所以即使您将其作为分辨率值返回,result.data
不会存在。setTimeout
打电话,做await delay(5000)
, 其中delay
返回超时后解决的 promise 。async
函数,您不需要将返回值包装为 promise 。如上所述,promise 对象已经返回,实际的 return
语句应指示该 promise 现在应解决的值。所以(没有测试),我会说这段代码会做得更好:
router.post(
"/api/result-store/v1/indexing-analyzer/:searchID/:id",
async (req, res) => {
console.log("Indexing started");
var hrstart = process.hrtime();
let result = null;
result = await IndexingStatusResult(req, res);
console.log("result is: ", result); // not .data
hrend = process.hrtime(hrstart);
console.info("Execution time (hr): %ds %dms", hrend[0], hrend[1] / 1000000);
res.status(200).send({
indexingTimeSec: hrend[0],
indexingTimeMillSec: hrend[1] / 1000000
});
}
);
// Helper function that's very useful in async functions:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const IndexingStatusResult = async (req, res) => {
const docID = parseInt(req.params.id) * 1000;
const dbName = "test_" + req.params.searchID;
let result = null;
while (true) {
try {
result = await axios(
`${params.HOST_NAME_WITH_PROTOCOL}/${dbName}/_design/searchAll/_search_info/searchAll`
);
result = result.data;
console.log(
"Number of docs indexed:",
result.search_index.doc_count,
"Total Docs needs to be indexed:",
docID
);
} catch (e) {
console.log(e);
return e; // ?? determine what you want to happen...
}
console.log(`result returned is : ${JSON.stringify(result)}`);
if (result && parseInt(result.search_index.doc_count) >= docID) break;
await delay(5000); // delay and keep looping
}
console.log("YAAAAAAYYYYYYYYYYYYY");
return result;
};
关于javascript - 等待永远不会解决,之后的下一行从未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58066392/
背景 我最近在 merge 期间遇到了一个意外未 merge 的文档文件的问题。 无论出于何种原因,我搞砸了 merge 并有效地删除了文件(和其他几个文件),因为我忘记了它们的存在。 现在我想查看我
我在我的网站上使用旧的 mysql 版本和 php 版本 4。 我的表结构: | orders_status_history_id | orders_id | orders_status_id |
我是一名优秀的程序员,十分优秀!