碼農干貨系列【19】--Promise.js with AJAX


更新

新增Promise.timeout方法,檢測task執行超時並且自動reject

使用

        Promise.timeout(f1(), 2000).then(f2, function () {
            alert("timeout");
        }).wait(5000).then(f3);
        function f1() {
            var promise = Promise();
            setTimeout(function () {
 
                console.log(1);
                promise.resolve("from f1");
            }, 1500)
 
            return promise;
        }
 
        function f2() {
            var promise = Promise();
            setTimeout(function () {
 
                console.log(2);
                promise.resolve();
            }, 1500)
 
            return promise;
        }
 
        function f3() {
            var promise = Promise();
            setTimeout(function () {
 
                console.log(3);
                promise.resolve();
            }, 1500)
 
            return promise;
 
        }

AJAX

function xhr(options) {
    var promise = Promise(),
        req = new XMLHttpRequest();
 
    req.open(options.method || 'GET', options.url, true);
 
    // Set request headers if provided.
    Object.keys(options.headers || {}).forEach(function (key) {
        req.setRequestHeader(key, options.headers[key]);
    });
 
    req.onreadystatechange = function (e) {
        if (req.readyState !== 4) {
            return;
        }
 
        if ([200, 304].indexOf(req.status) === -1) {
            promise.reject('Server responded with a status of ' + req.status);
        } else {
            promise.resolve(e.target.result);
        }
    };
 
    req.send(options.data || void 0);
 
    return promise;
}

使用:

xhr({ url: "xxx.php?a=xxx" }).then(function (msg) {
 
})

當然,promise支持等待N個AJAX都完成之后進行回掉:

Promise(xhr({ url: "a.php?c=xxx" }), xhr({ url: "b.php?d=xxx" })).then(function () {
 
})

上面的寫法的Promise.when的缺省形式。

Promise.timeout with AJAX

這里需要思考的是:timeout是屬於AJAX還是屬於Promise?

如果屬於AJAX,那么就有下面這種形式:

xxx.ajax("xxx.php", {
    method: "GET",
    data: null,
    onSuccess: function () { },
    onTimeout: function () { },
    timeout: 30000
});

如果屬於Promise:

Promise.timeout(xhr({ url: "xxx.php" }), 30000).then(
    function () { },
    function () { }
)

更多

有關promise更多信息你可以訪問:

getting started with Promise.js(總)

你可以點擊這里下載最新版promise.js。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM