的代码可以在我的回购here可以找到,但我会贴:为什么我不能通过从数组中调用它的解析器来解决承诺?
function asyncQueue() {
'use strict'
let i = -1
let j = 0
const resolvers = []
function put (p) {
if (!p.then)
p = Promise.resolve(p)
if (resolvers[j] instanceof Array) {
const done = resolvers[j][0]
const fail = resolvers[j][1]
p.then(a => done(a)).catch(e => fail(e))
} else {
resolvers[j] = p
}
++j
}
function get() {
++i
if (resolvers[i] instanceof Promise)
return resolvers[i]
return new Promise((resolve, reject) => resolvers[i] = [resolve, reject])
}
return {
get: get,
put: put
}
}
美中不足的是,在作为节点5.4,如果我们改变将函数像这样:
if (resolvers[j] instanceof Array) {
p.then(a => resolvers[j][0](a)).catch(e => resolvers[j][1](e))
} else {
resolvers[j] = p
}
这些解析器所属的承诺从来没有履行。 WAT?
我花了一个小时试图弄清楚我做错了什么,但后来决定只是绑定resolver refs并继续前进。任何人都不知道为什么从数组poo poos内联调用函数?我注意到a
是我们期望的值,但是通过这种方式将它传递给解析器会使所有者Promise处于未决状态,就好像我从未解雇过解析器。
什么是asyncQueue?它应该做什么? – elclanrs
WAT它是......它就像整个“你不应该做的”在一段代码中。 :) – Microfed
你为什么不喜欢亚马逊这么多... –