标签: asynchronous-method-call

JavaScript - 将上下文附加到异步函数调用?

同步函数调用上下文

在 JavaScript 中,通过在全局范围内使用堆栈,可以轻松地将某些上下文与同步函数调用相关联。

// Context management

let contextStack = [];
let context;

const withContext = (ctx, func) => {
  contextStack.push(ctx);
  context = ctx;

  try {
    return func();
  } finally {
    context = contextStack.pop();
  }
};

// Example

const foo = (message) => {
  console.log(message);
  console.log(context);
};

const bar = () => {
  withContext("calling from bar", () => foo("hello"));
};

bar();
Run Code Online (Sandbox Code Playgroud)

这允许我们编写特定于上下文的代码,而不必到处传递上下文对象,并且我们使用的每个函数都依赖于该上下文对象。

这在 JavaScript 中是可能的,因为保证了顺序代码执行,也就是说,这些同步函数在任何其他代码可以修改全局状态之前运行完成。

生成器函数调用上下文

我们可以使用生成器函数实现类似的功能。生成器函数使我们有机会在生成器函数的概念执行恢复之前进行控制。这意味着,即使执行暂停几秒钟(即,该函数在任何其他代码运行之前都没有运行完成),我们仍然可以确保其执行附加了准确的上下文。

const iterWithContext = function* (ctx, generator) {
  // not a perfect implementation

  let …
Run Code Online (Sandbox Code Playgroud)

javascript method-call async-await asynchronous-method-call

14
推荐指数
1
解决办法
942
查看次数