Node.js与浏览器:链接被拒绝的承诺

时间:2017-04-05 01:52:33

标签: javascript node.js google-chrome promise es6-promise

如果我在Chrome版本56.0.2924.87(64位)上尝试此操作 - 预期结果..

Promise.reject(null).then(console.log);
> Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: null}

然而,如果我尝试使用Node v7.8.0 - 潜在错误?

Promise.reject(null).then(console.log);
> Promise { <pending> }

我做错了什么或者这是一个错误? (我假设前者)

我很难通过手柄链嘲笑被拒绝的承诺,因为拒绝并没有通过链条:(

查看MDN文档我认为我的语法正确:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

2 个答案:

答案 0 :(得分:1)

两个输出都很好。在两个控制台中记录def test(expression, tags): required_tags = [] optional_tags = [] def parse_and(tokens): args = tokens[0][0::2] extend_list = filter(lambda x: isinstance(x, str) and x not in tags, args) required_tags.extend(extend_list) def parse_or(tokens): args = tokens[0][0::2] append_list = filter(lambda x: isinstance(x, str) and x not in tags, args) if append_list == args: optional_tags.append(tuple(append_list)) identifier = Word(alphanums + "_" + "-" + "'") expr = infixNotation(identifier, [ ("AND", 2, opAssoc.LEFT, parse_and), ("OR", 2, opAssoc.LEFT, parse_or), ]) expr.parseString(expression) return required_tags, optional_tags 时,您应该获得Promise {<rejected>: null}之类的内容 但是当你将Promise.reject(null)链接到它时呢?

  • Chrome会应用规则&#34; .then(console.log),而拒绝处理程序会返回在原件被拒绝时被拒绝的承诺&#34;并立即执行此操作 - 它已经知道结果将是一个被拒绝的承诺
  • 节点应用规则&#34; 承诺始终是异步的&#34;。它返回一个挂起的promise,并创建回调来解决它 - 在这种情况下,如果原始版本已被拒绝且没有传递拒绝处理程序,则会立即安排拒绝结果承诺。

Promises/A+ standard允许这两种实现,第一种可能更有效,而第二种更接近EcmaScript规范中描述的行为。
在实践中,你不会注意到差异。

答案 1 :(得分:0)

由于您拒绝承诺,您需要将错误处理函数定义为第二个arg:

Promise.reject(null).then(console.log, console.error);

或使用.catch()

Promise.reject(null).catch(console.error);