【问题标题】:How to launch a class function on promise in Javascript?如何在 Javascript 中按承诺启动类函数?
【发布时间】:2023-03-05 00:44:01
【问题描述】:

我有以下课程:

let graphFactory = new GraphFactory();

function GraphFactory(){
    let value = 'something';
    this.release = function() {
        return value;
    }
} 

现在,当我尝试以这种方式从程序中的另一个位置调用此函数时:

let newvalue = graphFactory.release();

它无法识别graphFactory,因为加载此函数需要一些时间。

我想通过在graphFactory 完全加载和激活时发出一个承诺来解决这个问题,但是当我尝试将一个函数添加到GraphFactory 函数中时,比如

function GraphFactory(){
    let value = 'something';
    this.release = function() {
        graphFactoryPromise(value);
    }
} 

然后

function graphFactoryPromise() {
     return new Promise(function(resolve,reject) {
            resolve('loaded');
     });
}

并将其称为

graphFactoryPromise().then(function(result) {
    let newvalue = result;
});

它仍然不起作用(graphFactory 无法识别)。

什么是解决这个问题的好方法?

更新 我想要的是只有在定义并加载了graphFactory 之后才能调用函数graphFactory.release()

【问题讨论】:

  • "*加载此函数需要一些时间。" - 究竟是在哪里加载的?您显示的代码中没有任何内容是异步的
  • 如果函数花费时间它必须已经有回调或承诺。
  • 请添加“加载graphFactory”的代码。目前还不清楚你在做什么。你是在异步加载value inside GraphFactory,还是加载整个模块文件,或者别的什么?

标签: javascript promise es6-promise


【解决方案1】:

试试release() 作为一个承诺:

const graphFactory = new GraphFactory();

function GraphFactory() {
  this.value = 'Something';

  const graphFactoryPromise = () =>
    new Promise(resolve => setTimeout(() => resolve('new-Something'), 1000));

  // Release is a promise
  this.release = async () => {
    this.value = await graphFactoryPromise(); // New Result
    return this.value;
  };
}

console.log(graphFactory.value);
graphFactory.release().then(console.log);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

【讨论】:

  • 谢谢!但实际上有什么方法可以实际访问函数graphFactory.release(),但只有在加载后才能访问?
  • @DmitryParanyushkin 我添加了一个超时,你能举例说明你的意思吗?什么意思是“只有加载后才能访问该功能”
猜你喜欢
  • 2016-11-11
  • 2020-05-15
  • 2018-10-04
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2018-09-07
  • 2015-08-13
  • 2014-08-31
相关资源
最近更新 更多