1

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

4

1 回答 1

1

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

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

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

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

   return buildPromise.promise();
};
于 2012-05-15T12:51:25.540 回答