【问题标题】:JS Promises: Promises are executing/resolving when assigning to a variableJS Promises:分配给变量时,Promises 正在执行/解析
【发布时间】:2020-03-17 19:14:28
【问题描述】:

我正在尝试将 new Promise() 分配给一个变量,然后将该变量推送到一个数组,从而产生一个承诺数组。然后我想稍后在单击按钮时执行这一系列承诺。

但是当将Promise 分配给变量时,它会立即执行。

ProcessExamples(){
    swal({
        title : 'Get Examples?',
        confirmButtonText: 'Yes',
    }).then( aRes => {
        if( aRes.value ){
            let lAllPromises = ExampleClass.GetExamplePromises();
        }
    });
}

static GetExamplePromises(){
    let lPromises = [];
    Examples.forEach( aExample => {
        let lPromise = new Promise( ( resolve, reject ) => {
            resolve( true );
        });
        lPromises.push( lPromise );
    });
    return lPromises;
}

当 Promise 数组返回到 ProcessExamples 方法时,所有的 Promise 都已解决。这不是我想要的,我该怎么办?

我尝试将 lambda ( resolve, reject ) => {} 替换为 function( resolve, reject ) {} - 没有任何效果。

我已经确定它在被推送到 Promises 数组之前就已经解决了,所以我假设它在分配给 lPromise 时发生了

【问题讨论】:

  • 真的很重要吗?如果您想确保那里有某种延迟,请执行setTimeout(resolve, 5000)。否则,你有一个已解决的承诺,你可以随时链接一些东西(p.then(...))......
  • "然后我想稍后执行这个承诺数组" - 这不是承诺的工作方式。承诺代表异步任务的结果,而不是计算本身,它不能被“执行”。改用函数调用。
  • "所有承诺都已解决" - 好吧,您将立即使用resolve(true) 解决它们。您还预计什么时候会发生这种情况?
  • 不,正如我所说,承诺不能从外部执行。 Promise.all 所做的只是创建一个新的 Promise 来观察数组中的 Promise。但即使Promise.all(lAllPromises) 确实“执行了它们”,ExampleClass.GetExamplePromises() 的行为又会有什么不同呢?它仍然会返回一个已经解决(“已执行”)的承诺。
  • @KesWalker 没有问题,代码完全可以正常工作。如果它所做的不是您想要的,您需要告诉我们您希望它做什么,以便我们可以建议如何以不同的方式编写代码 - 如果您发布您的真实代码,效果会更好。

标签: javascript promise


【解决方案1】:

但是在将 Promise 分配给变量时,它只是立即执行。

是的,这就是 Promise 构造函数所做的事情(它立即执行其回调函数,并传递它完成后回调可以调用的解析和拒绝函数)。

如果你想要一些可以稍后执行的东西,那么使用函数而不是 Promise。 (该函数可以返回一个承诺)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2020-01-03
    • 2015-11-24
    • 2021-06-07
    • 2019-01-14
    • 2021-01-18
    相关资源
    最近更新 更多