我一直在阅读很多关于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
答案 0 :(得分:1)
由于您将getLastImportTime
函数传递给when
辅助方法,因此它应显式返回promise
,(但在getLastImportTime()
中您不返回任何内容when()
希望你传递承诺,否则帮助者可以将其评估为立即解决(或拒绝)的承诺。
这可以解释为什么pipe
中的函数似乎在getLastImportTime()
所以尝试改变你的功能
var getLastImportTime = function () {
...
database.open();
database.query("SELECT ...");
return buildPromise.promise();
};