Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Javascript中共享异步函数响应的干净方法是什么?_Javascript_Node.js_Async Await - Fatal编程技术网

什么';在Javascript中共享异步函数响应的干净方法是什么?

什么';在Javascript中共享异步函数响应的干净方法是什么?,javascript,node.js,async-await,Javascript,Node.js,Async Await,我有类似的异步函数: class ArticleParser() { _title; async genTitle() { if (!this._title) { this._title = await takesALongTime(); } return this._title; } } 如果在第一次调用完成之前多次调用了genTitle,它将多次调用takesALongTime。我希望对genTitle的所有调用共享相同的返回承诺。有没有

我有类似的异步函数:

class ArticleParser() {
  _title;

  async genTitle() {
    if (!this._title) {
      this._title = await takesALongTime();
    }

    return this._title;
  }
}
如果在第一次调用完成之前多次调用了
genTitle
,它将多次调用
takesALongTime
。我希望对
genTitle
的所有调用共享相同的返回承诺。有没有一种干净/简单的方法可以做到这一点

这里有一个可行的解决方案,但看起来相当混乱:

class ArticleParser() {
  _title;
  _genTitlePromise;

  async _genTitle() {
    this._title = await takesALongTime();
  }

  async genTitle() {
    if (!this._title) {
      if (!this._genTitlePromise) {
        this._genTitlePromise = this._genTitle();
      }
      await this._genTitlePromise;
    }

    return this._title;
  }
}

你只需要稍后再开始等待,所以这个标题将是承诺的一个实例。在现实生活中,我会给它起不同的名字:

class ArticleParser {
  async genTitle() {
    if (!this._title) {
      this._title = takesALongTime();
    }

    return await this._title;
  }
}

你只需要稍后再开始等待,所以这个标题将是承诺的一个实例。在现实生活中,我会给它起不同的名字:

class ArticleParser {
  async genTitle() {
    if (!this._title) {
      this._title = takesALongTime();
    }

    return await this._title;
  }
}

确切地返回承诺,以便调用方能够处理已解析和已拒绝的承诺。从技术上讲,通过上面的示例,您可以从函数中删除async/await,并且对其调用方具有相同的效果。我最终使用了memoize装饰程序。正是如此!返回承诺,以便调用者能够处理已解析和已拒绝的承诺。从技术上讲,通过上面的示例,您可以从函数中删除async/Wait,并且它对调用者具有相同的效果。我最终使用了一个memoize装饰器。使用memoize函数可以记住参数和归还它。下面是ramda的例子:
constgettitle=R.memoize(()=>Promise.resolve(1));然后(x=>console.log(“w”,x));然后(x=>console.log(“r”,x))我最后使用了一个memoize装饰器。那么使用memoize函数来记住参数的输出并返回它呢。下面是ramda的例子:
constgettitle=R.memoize(()=>Promise.resolve(1));然后(x=>console.log(“w”,x));然后(x=>console.log(“r”,x))我最终使用了memoize装饰器。