2016-01-24 56 views
-1

的代码可以在我的回购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处于未决状态,就好像我从未解雇过解析器。

+1

什么是asyncQueue?它应该做什么? – elclanrs

+1

WAT它是......它就像整个“你不应该做的”在一段代码中。 :) – Microfed

+1

你为什么不喜欢亚马逊这么多... –

回答

1

** 编辑:错别字是一个红鲱鱼,所以我增加了一个新的答案回答您的实际问题,为什么承诺没有得到解决 **

要回答你的问题: 你有一个上线12和13错字:

const done = resolver[j][0] 
const fail = resolver[j][1] 

如果你改变那些resolvers(添加一个或多个),你的测试通过对节点5.5

你也许会想它没有资源olve,因为如果你是在说:

q = asyncQueue() 
x = q.get() 
q.put(1) 
x.then(value => console.log(value)) 

您的控制台将有两条线:

Promise { <pending> } 
1 

因为最后一行实际上是返回一个新的承诺,以及,这不会解决,直至控制台后记录返回值的默认行为。

+0

感谢您检测错别字,但您是否从阵列中调用了内联解析器?错别字只是拼写错误,我之前使用正确的变量名称的代码,并得到了输出,你很好。但是,如果我以这种方式调用解析器 - > p.then(a => resolver [j] [0](a)).catch(e => resolver [j] [1](e))< - I没有得到那个输出,事实上,从未记录过,承诺还在等待 –

+0

为了清楚起见,我编辑了我的帖子,并指出错别字不是导致问题的原因 –

0

好吧,现在我明白你的问题了,错别字已经解决了,我会再试一次。

有没有人有任何想法,为什么从数组内poo poos调用函数内联?

它与关闭j有关。

在第一个例子,你解决resolvers[j][0]同步,附带在.put()年底前++j

当你“内联”的访问解析器,我的意思是,用j键来访问resolvers诺言的解析器,他们的下一个节拍发生异步(如++j,因此您正在访问一个空数组索引并将其作为函数调用。

它“无声无息”的原因,或永远不会解决的是,抛出的抛出只会抛出另一个“函数是未定义的”错误,这可能会被捕获,除了创建的永远不会再被引用,并且是只是丢弃了,所以用.get()创建的诺言永远不会解决或拒绝。