我遇到的不便是,据我所知,没有办法使用内置的 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
相关函数调用时对其进行迭代。
因此,例如,当一个承诺被解决时,等待它的每个例程都将在其他任何事情之前恢复,特别是在解决承诺的其余例程之前。
其他示例,当例程等待承诺时,如果该承诺已经解决,则例程将立即恢复,而不是让其他执行。