我一直在阅读jQuery延迟和承诺,我看不出使用.then()&.done()成功回调之间的区别.我知道Eric Hynds提到.done()并.success()映射到相同的功能,但我猜是这样做的,.then()因为所有的回调都是在成功操作完成时调用的.
任何人都可以请你告诉我正确的用法?
我刚读这篇精彩的文章 -
https://www.promisejs.org/generators/
它清楚地突出了这个函数,它是一个处理生成器函数的辅助函数:
function async(makeGenerator){
return function () {
var generator = makeGenerator.apply(this, arguments);
function handle(result){
// result => { done: [Boolean], value: [Object] }
if (result.done) return Promise.resolve(result.value);
return Promise.resolve(result.value).then(function (res){
return handle(generator.next(res));
}, function (err){
return handle(generator.throw(err));
});
}
try {
return handle(generator.next());
} catch (ex) {
return Promise.reject(ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我假设或多或少是async关键字的实现方式async.所以问题是,如果是这种情况,那么async关键字和await关键字之间的区别是什么呢?是否await总是把东西放到一个承诺,而yield没有这样的保证?这是我最好的猜测!
你还可以看到async/await与本文中的生成器的yield相似,他描述了'spawn'函数:https://jakearchibald.com/2014/es7-async-functions/
@Domenic有一篇关于jQuery延迟对象失败的非常详尽的文章:你错过了Point of Promises.在其中,Domenic突出了jQuery承诺的一些失败,与其他包括Q,when.js,RSVP.js和ES6承诺相比.
我离开了Domenic的文章,认为jQuery承诺在概念上有一个固有的失败.我试图把这个例子放在这个概念上.
我认为jQuery实现有两个问题:
.then方法不可链接换一种说法
promise.then(a).then(b)
Run Code Online (Sandbox Code Playgroud)
jQuery将调用a随后b的时候promise满足.
由于.then在其他promise库中返回一个新的promise,它们的等价物将是:
promise.then(a)
promise.then(b)
Run Code Online (Sandbox Code Playgroud)
另一个问题似乎是异常处理,即:
try {
promise.then(a)
} catch (e) {
}
Run Code Online (Sandbox Code Playgroud)
Q中的等价物是:
try {
promise.then(a).done()
} catch (e) {
// .done() re-throws any exceptions from a
}
Run Code Online (Sandbox Code Playgroud)
在jQuery中,当acatch块失败时异常抛出并出现气泡.在其他承诺中,任何异常a将被传递到.done或.catch或其他异步捕获.如果没有任何promise API调用捕获异常,它就会消失(因此Q最佳实践,例如使用.done释放任何未处理的异常).
上述问题是否涵盖了jQuery实现承诺的问题,还是我误解或遗漏了问题?
编辑 此问题与jQuery <3.0; 从 jQuery 3.0开始,alpha jQuery是Promises/A +兼容的.
无论我的Promise是否成功解决,我都希望运行相同的操作.我不想将同一个函数绑定到两个args .then.是不是.always像jQuery一样?如果没有,我该如何实现?
必须在包含函数上使用async关键字才能在函数体内使用await。
async function fetchMovies() {
const response = await fetch('/movies');
console.log(response);
}
fetchMovies();
Run Code Online (Sandbox Code Playgroud)
在AWAIT被用来对异步完成方框取()调用。从代码中可以看出,函数fetchMovies()甚至没有返回任何值。即使这样做了,它也会影响调用者使用返回值的方式,但是为什么它会影响从函数体调用另一个异步调用呢?
我的问题是为什么需要这样做?有什么好的解释吗?它是否与实际实现await的需要有关,并在旧的 JavaScript 版本中支持它?
我知道使用了iffi模式能够使用await但这是否会以任何方式更改iffi代码块后面的代码的语义?
(async () => {
const response = await fetch('/movies');
console.log(response);
})();
Run Code Online (Sandbox Code Playgroud)
我也知道模块中支持顶级等待。
可能是我错过了一些非常明显的东西。
为什么使用await需要声明的外部函数async?
例如,为什么这个mongoose语句需要它返回一个promise的函数?
async function middleware(hostname, done) {
try {
let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec();
done(null, team);
} catch (err) { done(err); }
}
Run Code Online (Sandbox Code Playgroud)
我看到运行时/转换器解析了团队对它的价值的承诺和异步信号,它"抛出"被拒绝的承诺.
但是try/catch"捕获"那些被拒绝的承诺,那么为什么异步并等待如此紧密耦合呢?
正如牛仔在这里的评论中所说,我们都想"以类似于这样的风格编写[非阻塞JavaScript]异步代码:
try
{
var foo = getSomething(); // async call that would normally block
var bar = doSomething(foo);
console.log(bar);
}
catch (error)
{
console.error(error);
}
Run Code Online (Sandbox Code Playgroud)
"
所以人们已经提出了解决这个问题的方法
但是这些都没有导致代码像上面的同步样式代码一样简单易懂.
那么为什么javascript编译器/解释器不能阻止我们目前称为"阻塞"的语句呢?那么,为什么javascript编译器/解释器无法处理AS上面的同步语法,如果我们以异步方式编写它?"
例如,在getSomething()上面的处理中,编译器/解释器可以只说"这个语句是对[文件系统/网络资源/ ...]的调用,所以我会做一个注释来听取来自该调用的响应和同时继续我的事件循环中的任何东西".当调用返回时,执行可以继续doSomething().
您仍然可以维护流行的JavaScript运行时环境的所有基本功能
这只是对语法的一种调整,这将允许解释器在IT DETECTS一个异步操作时暂停执行任何给定的代码位,而不是需要回调,代码只是在调用异步调用后从行继续执行回报.
正如杰里米所说
JavaScript运行时中没有任何内容可以预先暂停执行给定任务,允许其他代码执行一段时间,然后恢复原始任务
为什么不?(如同,"为什么不能有?"......我对历史课不感兴趣)
为什么开发人员必须关心语句是否阻塞?计算机用于自动化人类擅长的东西(例如编写非阻塞代码).
您也许可以实现它
"use noblock"; "use strict";)打开整个代码页的"模式".编辑:"use noblock"; 这是一个糟糕的选择,误导了一些回答者,我试图完全改变常见的JavaScript运行时的性质.喜欢的东西'use syncsyntax';可能会更好地描述它.parallel(fn, fn, ...); …例如,为什么下面的函数需要"async"..是不是使用等待特定的足够的编译器来解析代码而没有歧义?
# Why do we need async here
async function foo() {
var user = await getUser(user_id);
console.log(user);
}
Run Code Online (Sandbox Code Playgroud)
是出于向后兼容的原因吗?(我想不出任何在标准Javascript中使用await键盘的代码..)?
是否主要是为了清楚地表明此函数使用新的async关键字?谢谢
javascript ×6
async-await ×3
ecmascript-6 ×3
asynchronous ×2
es6-promise ×2
jquery ×2
node.js ×2
promise ×2
generator ×1
q ×1