Javascript 我如何模仿笑话描述它的模式?

Javascript 我如何模仿笑话描述它的模式?,javascript,node.js,jestjs,Javascript,Node.js,Jestjs,如何在javascript中编写login和get函数?我有一种感觉,这是可能的一些混合内联函数,绑定和这种魔力。还是不可能 Promise.all([ 登录(“用户1”,()=>{ console.log(get(“/health”);//打印“user1/health” }), 登录(“用户2”,()=>{ console.log(get(“/ready”);//打印“user2/ready” }) ]); 我知道这样写是可能的。但我对没有obj的情况下写这篇文章感到好奇 login(&q

如何在javascript中编写
login
get
函数?我有一种感觉,这是可能的一些混合内联函数,绑定和这种魔力。还是不可能

Promise.all([
登录(“用户1”,()=>{
console.log(get(“/health”);//打印“user1/health”
}),
登录(“用户2”,()=>{
console.log(get(“/ready”);//打印“user2/ready”
})
]);
我知道这样写是可能的。但我对没有obj的情况下写这篇文章感到好奇

login("user1", (obj) => {
  obj.get("/ready");
});
这与Jest编写descript/it模式的方式类似吗

describe("Login test", () => {
  test("Login", async () => {
    expect("ready").toEqual("ready");
  });
});

所以,从技术上讲,你可以让它工作,但我不推荐,原因我会在后面解释

下面是一个使用
get
函数作为局部变量的工作示例。我们在调用回调之前立即分配给这个
get
变量。
它将登录上下文保存在其闭包范围内。因为JavaScript是单线程的,所以我们知道在运行回调之前不能再次重新分配变量

在这里,您可以看到它使用随机超时来模拟http调用。用户和URL将正确配对,即使它们以异步和随机顺序执行。(尝试多次运行此代码段以检查输出是否始终一致。)

const sleep=()=>
新承诺((resolve)=>setTimeout(resolve,Math.random()*1000));
让我们得到;
异步函数登录(用户名、回调){
console.log(“以用户名登录”);
等待睡眠();
get=异步(url)=>{
等待睡眠();
返回`/${username}${url}`;
};
回调();
}
我保证([
登录(“Alice”,async()=>{
log(等待获取(“/Active”);
}),
登录(“Bob”,async()=>{
log(等待获取(“/Build”);
}),
登录(“Colin”,async()=>{
log(等待获取(“/Compile”);
}),

]);这并不完全是Jest所做的,但它通过污染全局名称空间来做到这一点,而这通常不是您希望在应用程序中做的事情。可以像使用“with”关键字一样跳过对象名,但您肯定不想这样做,因为它已被弃用。在你的案例中,obj来自哪里还不清楚。你为什么要这样做?我想要这样做的原因是:我有一种导入脚本,它可以处理很多问题。获取、发布和修补函数调用。它们都共享同一个axios实例。运行asyncrounous很好。但后来我添加了登录功能,并希望使用不同的登录“上下文”来使用它自己的axios实例。同时,我希望保持导入脚本的旧的干净外观(没有obj.get)。我觉得这是可能的。但现在我有了疑问,原因变成了寻找javascript中的可能。Jest之所以能够做到这一点,是因为它以串行方式运行测试。因此,他们能够分配给test(或任何其他局部变量),知道它不会在两个不同的测试中同时使用。在您的示例中,您希望作为两个不同的用户并行登录,因此需要使用
obj
来跟踪这两个上下文。这是一个有趣的问题,这是一个很有说服力的解决方案。但我同意,在生产代码中使用它是一种神奇的方式。我真正的问题已经用obj解决了。主要是因为我认为代码更清晰易懂,没有更深入的知识。