首页 > 解决方案 > 如何制作一个 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 内部工作。因此,在这种情况下的任何评论都将不胜感激。

标签: javascriptnode.jsexpress

解决方案


JavaScript 是单线程的:事件循环管理器线程执行 JavaScript 代码,因此在被执行的 JavaScript 代码运行完成(即返回到事件循环)之前不能做任何其他事情。

JavaScript 中不存在睡眠函数。要同步运行此函数调用

sleep.sleep();

必须记录进入的时间并进入一个轮询循环,读取时间,直到系统时钟提前到足以返回。在此之前,函数继续循环而不返回事件循环并阻塞线程。

另一种使用asyncandawait可以是:

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程序。使用它的关键awaitawait操作符返回到事件循环,直到它的操作数承诺得到解决,允许其他代码在主线程中执行。


推荐阅读