jQuery Deferred有两个函数可用于实现函数的异步链接:
then()
deferred.then( doneCallbacks, failCallbacks ) Returns: DeferreddoneCallbacks解析Deferred时调用的函数或函数数组.
failCallbacks拒绝延迟时调用的函数或函数数组.
pipe()
deferred.pipe( [doneFilter] [, failFilter] ) Returns: PromisedoneFilter解析Deferred时调用的可选函数.
failFilter拒绝Deferred时调用的可选函数.
我知道then()已经存在了一段时间,pipe()因此后者必须增加一些额外的好处,但正是这种差异恰恰在于我.两者都采用了几乎相同的回调参数,尽管它们的名称不同,返回a Deferred和返回a 之间的区别Promise似乎很小.
我已经一遍又一遍地阅读官方文档,但总是发现它们太"密集"而无法真正地包围我的搜索已经找到了很多关于这个或另一个特征的讨论,但我没有发现任何真正澄清不同的东西每个人的利弊.
那么什么时候使用then它更好,pipe什么时候使用更好?
Felix的出色答案确实有助于阐明这两个功能的区别.但我想知道是否有时候功能性then()比那更好pipe().
很明显,它pipe()比then()以前更强大,似乎前者可以做后者可以做的任何事情.使用的一个原因then()可能是它的名称反映了它作为处理相同数据的一系列函数的终止的作用.
但是有一个用例需要then()返回由于它返回一个新的而Deferred无法完成的原始文件吗?pipe()Promise
jquery asynchronous decoupling jquery-chaining jquery-deferred
来自jquery api页面 http://api.jquery.com/jQuery.getScript/
成功回调
一旦脚本加载但未必执行,则会触发回调.
Run Code Online (Sandbox Code Playgroud)$.getScript("test.js", function() { foo(); });
如果foo()函数依赖于test.js,则无法成功执行.
我在google map api中看到了类似的东西,但在这种情况下你可以在ajax脚本url中指定回调函数.但总的来说有一种明显的方法可以等到执行ajax脚本来执行回调吗?
我对目前关于将async函数和关键字添加await到下一个EcmaScript的讨论感到困惑.
我不明白为什么有必要在async关键字之前使用function关键字.
从我的观点来看,await关键字等待发电机或承诺的结果做一个函数的return应该是足够的.
await应该在普通函数和生成器函数中简单可用,无需额外的async标记.
如果我需要创建一个函数作为结果应该可用await,我只需使用一个promise.
我的理由是这个很好的解释,下面的例子来自:
async function setupNewUser(name) {  
  var invitations,
      newUser = await createUser(name),
      friends = await getFacebookFriends(name);
  if (friends) {
    invitations = await inviteFacebookFriends(friends);
  }
  // some more logic
}
它也可以作为普通函数完成,如果函数的执行将等待完成孔函数,直到满足所有等待.
function setupNewUser(name) {  
  var invitations,
      newUser = await createUser(name),
      friends = await getFacebookFriends(name);
  if (friends) {
    invitations = await inviteFacebookFriends(friends);
  }
  // return because createUser() and getFacebookFriends() …我试图了解它们之间的区别
$.when(...).then(...)
$.when(...).done(...)
在jQuery中.据我所知,当内部对象完成加载时,它们都会执行.但有什么区别.实例将非常感激.
一些重要的问题有助于了解Ember的承诺:
是Ember的RSVP一样Tildeio的RSVP?如果没有,它们有何不同?它们有什么关系?
JavaScript"承诺"有不同的风格,即规格吗?如果确实如此,jQuery Promise是否使用一种类型的Promise规范(它是什么?)和Ember的RSVP.Promise使用一组不同的Promise规范,即Promises/A +?
如何灰烬RSVP的Promise.then(),Tildeio RSVP的Promise.then(),与jQuery的deferred.then()关系吗?  Ember的是如何Promise与then()不同的jQuery的Promise和then()?  知道避免错误是件好事.
Ember的RSVP.Promise示例用于Ember的RESTAdapter的updateRecord的ajax调用.这些是关于jQuery的一些SO帖无极,然后()#1和然后()#2.我现在处于混乱状态.
编辑为复制的评论 我引用:[ 如何从异步调用返回响应?
承诺是未来价值观的容器.当promise接收到值(已解决)或取消(拒绝)时,它会通知所有想要访问此值的"侦听器".
这个问题是关于如何返回promise中包含的值.答案对我很有用,因为它澄清了不可能返回值,而是访问 promise函数中的值.
关于这个主题的其他有用资料来源:
原始问题下方:
您能帮助理解如何从这两个例子中的承诺和差异中获得价值吗?
//I have a simple ajax call like:
var fetch = function(start_node, end_node) {
var apiEndpoint = 'localhost/nodes/';
var loadurl = apiEndpoint+start_node+'/'+end_node;
return $.ajax({
    url: loadurl,
    type: 'GET',
    dataType: 'json',
    jsonpCallback: 'json'
  });
};
// Then I processed results in something like:
    var getResult = function(data) {
      // do smtg with data
      var result = {'myobject' : result_from_data}
      return result …假设我有一个$.Deferred和一个jqXHR对象.有没有办法转移绑定到所有处理器的延迟(然后,一如既往地做,失败)到XHR对象(其中,按照我的理解,是延迟扩展)?
这就是我的想法:
$.ajaxOne = function(options) {
    var xhr = null;
    return function() {
        if(xhr) xhr.abort();
        xhr = $.ajax(options).always(function() {
            xhr = null;
        });
    }
}
我想创建一个类似的函数,$.ajax除非你快速连续多次调用它,它将中止最后一个请求并只完成最新的请求.要验证用户输入这是在许多情况下是有用的.
例如,您可能要检查,如果用户名取,但如果他们在用户名字段再次开始键入你开始你的Ajax调用后,你不关心最后的结果,只有最近的一个.
此外,我不认为请求保证按照它们发出的相同顺序返回(我想这取决于您的服务器设置),因此您也可能遇到同步问题.
无论如何,上面代码的问题是因为它返回一个函数,你可以随时执行你的ajax调用,但是你不能将你的完成处理程序绑定到它.所以我必须以某种方式混合延迟处理程序并将它们重新绑定到XHR对象.
我已经使用了异步编码,但我并不完全理解如何使用它 - 尽管我理解这个概念以及为什么需要它.
这是我的设置:
我有一个Web API,我将从我的ASP.NET MVC应用程序调用,我的Web API将调用DocumentDB.在代码示例中,我在向DocumentDB发送查询时看到了很多等待关键字.
如果我需要在我的MVC应用程序异步中使我的索引操作方法,我很困惑?如果我的Web API中的CreateEmployee()方法应该是异步的,我也很困惑?
在这种情况下使用异步的正确方法是什么?
这是我的代码(这段代码目前给我错误,因为我的MVC动作方法不是异步)---- ASP.NET MVC App Code ----
public ActionResult Index()
{
   Employee emp = new Employee();
   emp.FirstName = "John";
   emp.LastName = "Doe";
   emp.Gender = "M";
   emp.Ssn = "123-45-6789";
   using (var client = new HttpClient())
   {
      client.BaseAddress = new Uri("http://myWebApi.com");
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      HttpResponseMessage response = await client.PostAsJsonAsync("hr/create/newemployee", emp);
      if (response.IsSuccessStatusCode)
      {
         emp = await response.Content.ReadAsAsync<Employee>();
      }
   }
   // Display employee info
   return View(emp);
}
---- Web API代码----
private static readonly …我一直在阅读有关jquery中Promises的大量文章,并在发出多个ajax请求时避免了“回调地狱”。
我觉得但即使读这一切后,有被给予使用什么没有简单的答案-来讲.done(),.then()和.when()-在链接请求的条款。
我试图构建最基本的示例来说明我的观点。下面的代码可以完全按照我的要求运行,但是它唯一依赖的是.done(),我看不到其他方法(例如.then()或.when())适合什么位置。
因此,我创建了3个PHP脚本,并使用PHP的sleep方法来人为地延迟这些脚本完成所需的时间。延迟设置如下:
r1.php - 5秒r2.php - 1秒r3.php -3秒脚本本身就是这样简单:
<?php
    // r1.php
    echo "starting r1.php \n";
    sleep(5); // Delay execution. Varies as described above for each script
    echo "ending r1.php \n";
?>
因此,如果这些被并行运行,顺序,他们会完成会r2.php,r3.php话r1.php。
但是,如果我们想为了运行这些东西(r1.PHP, ,r2.php),r3.php并有jQuery的等待,直到每个AJAX请求之前就进入下一个做?例如,如果某物r2.php取决于r1.phpetc 的结果。
我写了以下内容-正是这样:
$(document).ready(function() {
   $.ajax({
        url: 'ajax/r1.php',
        method: 'get'
   }).done(function(response1) { …jquery ×7
javascript ×3
promise ×3
ajax ×2
async-await ×2
asynchronous ×1
c# ×1
decoupling ×1
ecmascript-6 ×1
ember.js ×1
rsvp.js ×1
variables ×1