是否有串行和同步解析的promise库?

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

我遇到的不便是,据我所知,没有办法使用内置的 Promise 来解决同步块中的 Promise。

具体如下代码

var o = {};
function set(index, value) {
    console.log(`setting ${index} to ${o.index = value}`);
}

Promise.resolve().then(()=>set('a', 1)).then(()=>set('b',2))
Promise.resolve().then(()=>set('c', 1)).then(()=>set('d',2))

console.log(`a is ${o.a}`);

输出:

a 未定义
将 a 设置为 1
将 c 设置为 1
将 b 设置为 2
将 d 设置为 2

是否有像 lib 这样的 Promise,其 Promise 会产生以下输出:

将 a 设置为 1
将 b 设置为 2
将 c 设置为 1
将 d 设置为 2
a 是 1

显然,在上面的例子中不需要求助于Promises,但是在我的用例中,设置'a'会导致只需要做一次的预处理,而'b'可以设置多次,并且在内部使用设置了相同的同步块(没有自由)。

我查过蓝鸟,我不知道他们的承诺在内部是如何工作的,但他们似乎只接受使用承诺链。 Q Promise 可能是我正在寻找的东西,我不确定。 更一般地说,搜索许多 Promise 库的文档,查询一些小众的、贬值的需求,并且可能考虑了错误的关键字和概念,这让人感到畏惧。

这绝对是 ProblemXY 的一个例子,其中 X 可以在没有承诺的情况下以多种方式解决,例如通过同步初始化器,但我觉得问题 Y 本身很有趣(并且可能是重复的),所以我'我还在问。

我会绕过给问题 X 自己的问题,但长话短说,我喜欢有时在单个 js 同步执行块中使用 promises 的表达能力来拉取值而不是推送它们并展平回调和尝试捕捉金字塔。

编辑:

为了阐明我的好奇之处,我构建具有所需属性的 Promiselike 的方式如下:

let f = myPasync(function*(){ //equivalent to async function declaration
 v = yield myPAwait(myPromiseInstance); //equivalent of v = await myPromiseInstance;
})
let pa = new myP( *(resolve, reject)=>{} ) //equivalent to new Promise((resolve, reject)=>{}) ; for simplicity, resolve and reject can be naked properties of pa
pa.myPthen((*()=>{})()) //equivalent to pa.then((v)=>{})

然后,不是每次滴答动态迭代任务队列,而是以 FIFO 方式将新解决的

then
s 和
await
s 推送到该队列,

我会以后进先出的方式推送到任务队列,并在任何

myP
相关函数调用时对其进行迭代。

因此,例如,当一个承诺被解决时,等待它的每个例程都将在其他任何事情之前恢复,特别是在解决承诺的其余例程之前。

其他示例,当例程等待承诺时,如果该承诺已经解决,则例程将立即恢复,而不是让其他执行。

javascript asynchronous promise synchronous
© www.soinside.com 2019 - 2024. All rights reserved.