Mozilla的JavaScript文档与#39;之间有什么区别?承诺(见API page)和jQuery的承诺(见API page)?
Mozilla的承诺似乎只有两种方法:然后抓住。 jQuery的承诺似乎有更多的方法,包括:then,done和fail。 (from here)
为什么Mozilla上的JS API没有done()
?如果我想在JavaScript中使用done()功能怎么办?我该怎么办?
答案 0 :(得分:3)
Mozilla的javascript承诺基于ES6 standard,而jQuery承诺是在ES6发布之前创建的。
根据我对jQuery文档的阅读,ES6 then
等同于jQuery done
。
实际上有一大堆承诺库,但对我来说ES6是最容易理解的。你不需要超过"然后"并且"赶上"并且很容易将一起链接到一系列操作中。使用Promise.all
添加到并行任务,并覆盖所需内容的99%。
return doSomething().then(function(result) {
return doSomethingElse(result);
}).then(function(secondResult) {
return doThirdSomething(secondResult);
}).catch(function(err) {
console.log(err);
}).then(function(finalResult) {
// a then after a catch is like a "finally" or "always"
return finalResult;
});
jQuery支持的一些不在ES6中的东西是某种"进步"解决。
答案 1 :(得分:3)
jQuery的deferred API臃肿并早于承诺库。一旦他们意识到承诺有多么有用,他们就会添加done()
(或previosly, pipe
)方法,但它they failed to get it 100% right。
为什么Mozilla上的JS API没有
.then()
?
完全没必要。所有Promises/A+ compatible implementations(包括ES6)只需要一个方法:done()
。这是完全普遍的,你可以用它做任何事情 - 这是承诺的primitive。
如果我想在JavaScript中使用
Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) … this.then(cb).then(null, function(err) { /* ignore */ }); return this; };
功能该怎么办?我该怎么办?
好吧,你可以自己实现它:
then
但正如你从中可以看到的那样,它实际上并不是很有用。它不会链接,它会忽略异常,所以你应该只在任何地方使用$final = $PropMgr.GetValue($section, $property)
$final = $ExecutionContext.InvokeCommand.ExpandString($final)
。
答案 2 :(得分:0)
我可以说ES6为什么没有.done
。但是,您仍然可以使用类似.done
的内容。
yourPromiseObject.then(successHandler).catch(failureHandler).then(doneHandler);
第一个then
处理成功响应,但不会使用yourPromiseObject
的函数拒绝或抛出异常来调用。第二个问题对于“解决”任何异常/拒绝至关重要(简而言之,您告诉承诺对象继续前进,您知道存在错误)。确保你返回一些有效的东西,即使是failureHandler
除了return 0
之外的其他东西都很简单。现在可以保证最后的.then
被调用,这就是你的.done