jQuery的推迟异步功能(Jquery Deferred for an async functio

2019-10-16 16:50发布

我一直在阅读了很多关于JQuery's deferred对象。 我可以看到它是如何工作去耦合码。 我写了使用Async.js这orignally,但会被建议使用的承诺。

我发现大多数例子都是连锁的事情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);

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

Answer 1:

因为你传递getLastImportTime功能when的辅助方法,它应该明确地返回一个promise ,(但在getLastImportTime()你是返回任何操作, when()期待你传递一个承诺 ),否则助手可以评估它作为一个直接的解决(或拒绝)的承诺。

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

因此,试图改变自己的功能,像这样

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

   return buildPromise.promise();
};


文章来源: Jquery Deferred for an async function