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ヘルパーメソッドに渡すので、明示的にを返す必要がありますpromise(ただし、getLastImportTime()何も返さず、 promisewhen()を渡すことを期待しています)。そうでない場合、ヘルパーはそれを即座に解決された(または拒否された)promiseとして評価できます。

pipeこれは、の関数が以前に実行されたように見える理由を説明できますgetLastImportTime()

だからあなたの機能をそのように変えてみてください

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

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