我如何才能取消这个“示例”承诺--- 即,将承诺归因于变量以供以后传递/使用---
// 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()
承诺立即执行。 但是您可以将它们包装在一个函数中,该函数在调用时会创建/执行 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;
我相信您正在寻找的是返回 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
来代替。