我只是花了很长时间在承诺中挖掘回调,想知道为什么没有调用某些回调。最后问题是声明不正确,而不是
Promise.when(null).then(function () {
var p = new Promise();
p.fail(new Error("some message"));
return p;
}).then(function () {
console.log("success");
}, function (err) {
console.log("failure");
});
我做了
Promise.when(null).then(function () {
var p = new Promise();
p.fail(new Error("some message"));
return p;
}).then(function () {
console.log("success");
}), function (err) {
console.log("failure");
};
无论Promise的实施细节如何,归结为一件事:
function(){};//throws SyntaxError
"something valid, or function call", function(){};//no error
我希望有人向我解释一下。为什么首先抛出SyntaxError
而后者有效(至少在浏览器控制台中)?它似乎声明了匿名函数。
当我尝试
eval("function(){};//throws SyntaxError")
eval("'lala',function(){};//no error")
所以有人可以解释为什么第一个无效而后者是什么?
答案 0 :(得分:1)
以关键字“function”开头的语句必须是有效的函数声明语句。这需要函数的名称。
在表达式(或表达式语句)中,该规则是不同的;不需要名称,因为该函数在该上下文中充当值。那时不需要名字。
因此:
function myFunction() {
// ...
}
是一个函数声明语句。这样:
5 + function() {};
是一个表达式语句(一个愚蠢的语句,但JavaScript就可以了)。同样,导致无错误的示例是使用逗号运算符的表达式:
"lala", function() {};
关键字“function”不出现在这两个表达式的任何一个的开头,因此解析器不会坚持该函数的名称。
答案 1 :(得分:0)
您的原始代码无效,因为正如您所知,第二个函数未作为参数传递 - 您将关闭的paren放在函数之前。它没有引起任何错误,因为JavaScript将其识别为函数表达式。您对逗号运算符的使用告诉JavaScript,期望下一个语句是表达式。
函数声明不能是匿名的,但函数表达式可以。一个独立的匿名函数看起来像一个缺少JavaScript标识符的函数声明。但是,结合运算符,JavaScript将匿名函数视为运算符的操作数表达式。
语句'lala',function(){}
包含一个表达式('lala'
),后跟一个运算符(,
),后跟一个函数表达式。此陈述类似:0,function(){}
。 Promise.when(...).then(...)
也是一个有效的表达式,因此Promise.when(...).then(...),function(){}
的工作原理相同。