Jquery延迟了异步函数

时间:2012-05-15 12:49:04

标签: jquery asynchronous jquery-deferred

我一直在阅读很多关于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

1 个答案:

答案 0 :(得分:1)

由于您将getLastImportTime函数传递给when辅助方法,因此它应显式返回promise,(但在getLastImportTime()中您不返回任何内容when()希望你传递承诺,否则帮助者可以将其评估为立即解决(或拒绝)的承诺。

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

之前执行

所以尝试改变你的功能

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

   return buildPromise.promise();
};
相关问题