javascript - 如何制作一个 JavaScript 程序,以便一个 API 调用不会隐藏另一个?
问题描述
我有一个 JavaScript API,但这个 API 不会让其他 API 在运行期间被调用或再次调用自己。具体来说,这个 API 涉及睡眠一段时间,当它处于睡眠状态时,我希望其他 API 调用或相同的 API 调用也应该发生。
我为此创建了一个示例程序,它的行为类似。寻找您的意见和建议,谢谢。
'use strict';
// importing required libraries
const sleep = require("sleep");
const express = require('express');
const app = express();
const port = 1234;
const server = require("http").createServer(app);
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// this is the function that just sleeps for 30 seconds and after that is resolves the output
// because of this function the API calls needs to wait till it is completed
const promisified = async function () {
console.log("Promisified started")
return new Promise((resolve, reject) => {
let count = 0
console.log("promisified hit")
while (true) {
console.log("Sleeping for 30 seconds. Try: ", count);
sleep.sleep(30);
if (count >= 1) {
console.log("Timeout breaking");
return resolve("Broke out");
}
count += 1;
}
})
}
// this is the function that is being called on the API hit, which internally calls promisified function
const justafunction = async function (req, res) {
console.log("Just a function api hit");
res.status(200).send("api hit")
promisified()
.then(data => {
console.log("This then is workd...",data);
})
.catch(err => {
console.log("Error is :", err);
});
let x = await promisified();
console.log("X is here...",x);
}
// this is the API that we will call
app.get("/test", justafunction);
server.listen(port, function () {
console.log(" Server Successfully Started ", port);
});
理想情况下,在 python 和 C++ 中会打开一个线程来独立完成这项工作,但我没有太多的 JavaScript 内部工作。因此,在这种情况下的任何评论都将不胜感激。
解决方案
JavaScript 是单线程的:事件循环管理器线程执行 JavaScript 代码,因此在被执行的 JavaScript 代码运行完成(即返回到事件循环)之前不能做任何其他事情。
JavaScript 中不存在睡眠函数。要同步运行此函数调用
sleep.sleep();
必须记录进入的时间并进入一个轮询循环,读取时间,直到系统时钟提前到足以返回。在此之前,函数继续循环而不返回事件循环并阻塞线程。
另一种使用async
andawait
可以是:
function sleep( msec) {
return new Promise(resolve=>setTimeout(resolve, msec));
}
// calling example
async function test() {
console.log("sleep for 3000 msec");
await sleep(3000);
console.log("sleep expired");
}
document.querySelector("button").addEventListener("click", test);
Sleep for 3 seconds: <button type = "button">ok</button>
请注意,返回 promise 的 sleep 版本必须async
在 JavaScript 中的函数中调用await
运算符,或者使用处理程序添加履行处理then
程序。使用它的关键await
是await
操作符返回到事件循环,直到它的操作数承诺得到解决,允许其他代码在主线程中执行。
推荐阅读
- html - 将图像放在文本旁边的问题(不是浮动问题)
- swift - 在显示 NSPopover 时试图了解 SIGSEGV 崩溃
- php - Codeigniter MySQL使用varchar类型值选择最大值
- r - 如何在 R 中定义递归 for 循环?
- instagram - Instagram 客户端(隐式)身份验证不可用?
- html - CSS:如何实现加载条动画
- c - 我们如何使用三元运算符和尽可能多的 else-if?
- arduino - 使用arduino上的按钮停止带有变量的while循环
- c# - 项目配置问题:ASP.NET项目没有添加C#类的选项
- javascript - 数据排序后ReactJS渲染未触发