2012-05-15 69 views
1

我一直在阅读很多关于JQuery'sdeferred的对象。我可以看到它是如何工作的去耦合代码。我使用Async.js写了这个Orignally,但会被推荐使用promise。jquery推迟异步函数

我发现的大多数例子只是将事情链接到AJAX调用。我想链接一个异步函数,但不知道如何去做。我正在从数据库中检索一段时间,然后使用这段时间作为URL中的一个参数,最后我想要拨打AJAX

这是我在哪里:

var fetch = function (contactId, callback, errorCallback) 
    { 
     var buildPromise = new $.Deferred(); 

     var getLastImportTime = function() 
     { 
      var querySuccess = function (tx, result) 
      { 
       buildPromise.resolve("7 oclock"); 
      }; 

      var queryError = function (tx, e) 
      { 
       buildPromise.reject("Error querying database"); 
      }; 

      database.open(); 
      database.query("SELECT EventImportTime FROM Contact WHERE Contact.Id = ?", [contactId], querySuccess, queryError); 
     }; 

     var buildUrl = function (lastImportTime) 
     { 
      console.log("I do happen"); 
      var url = "http://"; 
      url += 'MobileGetChangedEvents.aspx?Reference='; 
      url += '&LastImportTime='; 
      url += lastImportTime; 
      url += '&Format=JSON'; 
          return url; 

     }; 

     var makeRequest = function (url) 
     { 
      getJSON(url, callback, errorCallback) 
     }; 

     $.when(getLastImportTime()).pipe(buildUrl).then(makeRequest); 

也是我管的方法似乎是第一个叫:■

回答

1

因为你传递getLastImportTime功能when helper方法,它应该明确地返回一个promise ,(但是在getLastImportTime()中你没有任何回报,并且when()期待你通过承诺),否则帮手可以评估它作为立即解决(或拒绝)的承诺。

这可以解释为什么它似乎在pipe该功能之前getLastImportTime()

所以试图改变自己的功能,像这样

var getLastImportTime = function() { 
    ... 
    database.open(); 
    database.query("SELECT ..."); 

    return buildPromise.promise(); 
}; 
+0

啊好了,这是有道理的执行。构建url现在可以获得正确的值。我是否应该使用“.then”尝试打电话提出请求?或者我应该再次使用管道?在一分钟我得到“网址”是未定义的。 (对不起,这是我第一次承诺) – JonWells

+0

@CrimsonChin与'pipe'一起使用的方法必须返回一个值。从API文档''这些过滤器函数可以返回一个新的值传递给管道承诺的done()或fail()回调“http://api.jquery.com/deferred.pipe/现在它应该可以工作如你所愿,不是吗? – pomeh

+0

尝试用'.pipe(function(time){buildUrl(time)})'''更改'.pipe(buildUrl)'' – fcalderan