使用 Promise 共享异步调用的结果

威库

我是 JavaScript 承诺的新手,想知道这是否是在 JavaScript/Node.js 中异步共享结果的常见/惯用方式。

我有一个方法,例如calc,异步计算项目列表。我只希望结果计算一次,其他cals要么得到已经计算的结果,要么等到结果计算出来。我提出了以下设计(一个演示它的最小示例)。

let result: Promise<number[]>;

async function calc(): Promise<number[]> {
    if (result) {
        return result;
    }

    result = new Promise<number[]>(async (resolve, reject) => {
        await delay(5000);
        resolve([1, 2, 3, 4, 5]);
    });
    return result;
}

async function delay(time: number) {
    return new Promise<void>((resolve, reject) => setTimeout(resolve, time));
}

这个设计有什么缺陷吗?calc方法是否总是异步的?即,结果在与调用者不同的堆栈中运行?

TJ克劳德

calc方法是否总是异步的?

使用承诺calc返回的结果将始终是异步的(这可能是您真正的意思)。这是由规范保证的:无论承诺是否已经解决thencatch回调总是异步调用。

请注意,如果您要返回一个承诺(您在 中的所有代码路径中calc)并且不在(您不是)await的直接主体中使用calc,则您不需要声明calcasync这样做在概念上增加了一层承诺(这在很大程度上是无害的,但是......)。

这个设计有什么缺陷吗?

几个次要的。delay当然,这只是代表您将要做的实际工作。await delay();async没有try/ 的承诺执行器回调中使用catch意味着如果来自delay rejects的承诺,您将错过它您想确保处理拒绝(可能在执行程序回调中使用try/catch或不在其中使用await)。

与此相关的是,代码也成为 Promise 创建反模式的牺牲品由于delay提供了一个承诺,这里不需要new Promisein calc只需使用delay.

所以calc可以看起来像这样:

function calc(): Promise<number[]> {
    if (result) {
        return result;
    }

    return result = delay(5000).then(() => [1, 2, 3, 4, 5]);
}

由于您明确处理了承诺,因此我可能不会使用async它。

现场演示(只是为了好玩;我将延迟设为 800 毫秒而不是 5000 毫秒):

let result;
function calc() {
    if (result) {
        return result;
    }

    return result = delay(800).then(() => [1, 2, 3, 4, 5]);
}
function delay(time) {
  return new Promise(resolve => {
    setTimeout(resolve, time);
  });
}

console.log("A");
calc().then(() => { console.log("C"); });
console.log("B");
calc().then(() => { console.log("D"); });
setTimeout(() => {
  console.log("E");
  calc().then(() => { console.log("G"); });
  console.log("F");
}, 1000);

如您所见,它输出A B,等待 800 毫秒,输出C D,再等待约 200 毫秒,然后输出E F G,证明消费者 calc的承诺始终是异步的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用JS Promise处理异步调用?

来自分类Dev

使用promise和defer在angularJS中进行同步和异步调用

来自分类Dev

Node.js 使用 Promise.all 返回异步调用?

来自分类Dev

使用jQuery Promise模拟同步调用

来自分类Dev

循环异步调用并加入返回的promise

来自分类Dev

使用TypeScript在AngularJS中的指令之间共享来自异步调用的数据

来自分类Dev

Promise链上的2个函数被异步调用

来自分类Dev

在JavaScript中异步调用多个Promise的正确方法

来自分类Dev

使用Java线程进行异步调用

来自分类Dev

使用异步调用自动重新登录

来自分类Dev

已使用异步调用回调?

来自分类Dev

如何使用 mockito 存根异步调用?

来自分类Dev

使用 xCode 进行异步调用

来自分类Dev

使用Promise进行异步递归

来自分类Dev

通过许多异步调用在WebAPI中使用异步

来自分类Dev

在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

来自分类Dev

调用异步方法时,StreamWriter使用同步调用

来自分类Dev

Promise链中有条件的异步调用在进行之前未完成

来自分类Dev

使用Promise等待嵌套的异步任务

来自分类Dev

使用JavaScript Promise创建异步事件

来自分类Dev

使用异步过滤和映射Promise

来自分类Dev

ngInit无法异步工作(使用$ q Promise)

来自分类Dev

使用promise系列而不是异步系列

来自分类Dev

使用异步调用时异常处理的良好模式

来自分类Dev

使用异步调用时,实体框架挂起

来自分类Dev

在Entity Framework中使用DbContext运行异步调用

来自分类Dev

如何使用Ninject InRequestScope处理异步调用?

来自分类Dev

如何在角度循环中使用异步调用?

来自分类Dev

使用OAuth2改进异步调用

Related 相关文章

热门标签

归档