这个.async()在JavaScript中做什么

这个.async()在JavaScript中做什么,javascript,asynchronous,Javascript,Asynchronous,一直在代码中看到这种模式,但在谷歌中找不到任何对它的引用,这很奇怪。有人能给我指出这个.async()函数的引用吗 var done = this.async(); // ... $.get(path, function(contents) { // or some other function with callback // ... done(JST[path] = tmpl); }) var getText = function() { return

一直在代码中看到这种模式,但在谷歌中找不到任何对它的引用,这很奇怪。有人能给我指出这个.async()函数的引用吗

  var done = this.async();
  // ...
  $.get(path, function(contents) { // or some other function with callback
    // ...
    done(JST[path] = tmpl);
  })
var getText = function() {
  return $.get('<some-url>', function(text) {
    return text;
  });  // ??????
};

这是一种解决
这个
在回调内部转义问题的方法。如果没有这个额外的引用,代码将如下所示:

$.get(path, function(contents) { // or some other function with callback
  //Wrong! `this` might no longer point to your object
  this.done(JST[path] = tmpl);
})
不幸的是
内部响应回调与它外部的
不同。事实上,它可以是任何东西,这取决于
$。get
(使用调用回调)决定它是什么。大多数人使用名为
的额外参考来达到相同的目的:

var that = this;
// ...
$.get(path, function(contents) { // or some other function with callback
  // ...
  that.async(JST[path] = tmpl);
})
这种模式似乎也合理且可读

哦,如果您对这种语法感到好奇:

done(JST[path] = tmpl)
这是用作表达式的赋值。赋值的值位于右侧,因此此代码相当于:

JST[path] = tmpl;
done(tmpl);

var done=this.async()
done(blah)
是在同步函数中返回从异步调用(例如
$.get
)获取的值的巧妙技巧

让我们看一个例子:

var getText = function() {
  return "hello";
};
var text = getText();
这是一个非常简单的函数调用,所以这里没有谜题。但是,如果需要在getText()函数中异步获取文本,该怎么办

  var done = this.async();
  // ...
  $.get(path, function(contents) { // or some other function with callback
    // ...
    done(JST[path] = tmpl);
  })
var getText = function() {
  return $.get('<some-url>', function(text) {
    return text;
  });  // ??????
};
魔法,对吧

我还不知道
这个.async()调用的内部工作原理。我不知道是否有库提供了该函数,但您可以看到Backbone.LayoutManager使用了这个技巧(搜索this.async)

此外,Tim Branyen(主干布局管理器的作者)在他的视频教程(大约14:00-15:00)中简要介绍了这一点。在视频中,蒂姆说本·阿尔曼想出了这个把戏。再看看这个

我认为混合使用异步和同步函数是一个非常巧妙的技巧


干杯,

var done=this.async()
是Grunt中用于帮助在任务中执行异步功能的模式

您需要调用
done()
done(returnValues)
来告诉Grunt任务已经完成(在异步任务链之后)

了解更多信息:

这不是内置功能。它必须由某个库/框架提供。这是一件很麻烦的事情。this.async()是他们任务的一部分:-1:这并没有回答关于
this.async()
的问题,而是谈论一些问题中甚至没有出现的内容。我对@Tony为什么接受这个答案感到困惑。我在约曼的“创建发电机”教程()中遇到了这个问题。