JS/ES 离线并存储 Promise 供以后使用

问题描述 投票:0回答:2

我如何才能取消这个“示例”承诺--- 即,将承诺归因于变量以供以后传递/使用---

// this example promise works OK... 
// just test with x=0 and x<>0
var x=0; 
( new Promise( ( a, b ) => 
    { if ( x==1 ) a(); else b(); } ) )
    .then( ()=>console.log( "RS=>OK" ), ()=>console.log( "RJ=>KO" ) 
    )

我想将承诺归因于一个变量,就像

var p = new Promise( ... )

但承诺是在创建时执行的...

?我怎样才能推迟执行此操作? 调用 Promise 的方法...例如:

p.exec()

javascript promise ecmascript-next
2个回答
5
投票

承诺立即执行。 但是您可以将它们包装在一个函数中,该函数在调用时会创建/执行 Promise。 例如:

var p = () =>
  new Promise( ( a, b ) => 
    { if ( x==1 ) a(); else b(); } ) )
  .then( ()=>console.log( "RS=>OK" ), ()=>console.log( "RJ=>KO" );

// when ready to start
var actualPromise = p();
await actualPromise;

0
投票

我相信您正在寻找的是返回 Promise,以便您的调用者可以等待它解决,同时您希望延迟执行解决/拒绝 Promise 的函数。

现在这是否是一个好主意,我会在最后回答。

您可以使用以下内容:

const queue = [];

function enqueuePromise = ( someArguments ) {
    let localResolve;
    let localReject;

    const delayedPromise = new Promise(( resolve, reject ) => {
        localResolve = resolve;
        localReject  = reject;
    });

    queue.push(() => {
        resolve: localResolve,
        reject: localReject,
        execute: async () => {
            try {
                localResolve( await someFunctionUsing( someArguments ));
            } catch {
                localReject();
            }
        },
    });
    return delayedPromise;
}

所以在上面:

我们维护一个 Promise 队列,希望稍后“执行”。

函数“enqueuePromise”创建一个新的Promise并存储对resolve和reject方法的本地引用。同时我们将一个新对象推入队列。我们返回 Promise,这样无论谁调用这个函数都可以等待它的最终执行。

您的队列处理可能如下所示:

function runQueue() {
    if ( queue.length === 0 ) return; // nothing left to do
    const task = queue.shift();
    task.execute();
}

就是这样。等待原始 Promise 的函数将处理其范围内的错误。原始的

execute()
方法甚至可以是请求下一个
runQueue()
调用的方法,因此队列是自我管理的。

如果您正在对仅最新作业结果重要的作业进行排队(例如渲染),则可以使用此机制来删除(但不要忘记拒绝()!)较早的 Promise,并且仅“执行最后一个 Promise” “(不过你想消除这个问题)。

那么这是个好主意吗?

你是否在绕过 Promise 的意图?是的,也不是,您仍然清楚地定义了一个异步函数,该函数可能在将来的某个时刻以某种结构化的方式完成。

但是代码是不言自明的吗?如果您正在进行队列管理,请重新考虑如何对这些任务进行排队,并考虑使用单个

Promise.all
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.