Jquery延迟了异步函数

我一直在阅读很多关于JQuery's deferred对象的内容。 而且我可以看到解析代码的工作原理。 我使用Async.js写了这个,但建议使用promise。

大多数例子我发现只是链接到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); 

我的管道方法似乎首先被称为:s

因为你将getLastImportTime函数传递给helper方法,所以它应该显式地返回一个promise ,(但是在getLastImportTime()你什么也没有返回,而when()期望你传递一个promise )否则帮助者可以将它作为一个立即解析的方式进行评估(或拒绝承诺。

这可以解释为什么pipe中的函数似乎在getLastImportTime()之前执行

所以尝试改变你的function

 var getLastImportTime = function () { ... database.open(); database.query("SELECT ..."); return buildPromise.promise(); };