【问题标题】:Jquery Deferred for an async functionJquery Deferred 用于异步函数
【发布时间】:2012-05-15 12:49:03
【问题描述】:

我已经阅读了很多关于 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

【问题讨论】:

    标签: jquery asynchronous jquery-deferred


    【解决方案1】:

    因为你将getLastImportTime 函数传递给when 辅助方法,它应该显式返回一个promise,(但在getLastImportTime() 中你什么都没有返回,when() 期望你传递一个promise ) 否则助手可以将其评估为立即解决(或拒绝)的承诺。

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

    所以试着像这样改变你的功能

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

    【讨论】:

    • 啊,好吧,这是有道理的。构建 url 现在得到正确的值。我应该使用“.then”来尝试调用 make request 吗?还是我应该再次使用管道?在我得到“url”的那一刻是未定义的。 (对不起,这是我第一次尝试承诺)
    • @CrimsonChin 与pipe 一起使用的方法必须返回一个值。来自 API 文档 "These filter functions can return a new value to be passed along to the piped promise's done() or fail() callbacks" api.jquery.com/deferred.pipe 现在它应该可以按您的意愿工作,不是吗?
    • 尝试将.pipe(buildUrl)更改为.pipe(function(time) { buildUrl(time) })
    • @F.Calderan 这应该改变什么?
    • 它们应该真的是等价的,但是如果他的方法不起作用……只是尝试一下,但是当promise解决时他不应该得到一个未定义的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多