javascript - 在外部回调中解决/拒绝 Promis

标签 javascript ajax callback promise

我正在玩 ajax 并反复 promise 为 ajax 调用创建一个抽象版本。以下代码运行良好。

function ajax(url){
    var xhr = {
        rq : function (method, url){
            var prom = new Promise(function (resolve, reject){
                var client = new XMLHttpRequest();
                //only accept 
                client.open(method,url,true);
                client.send();
                client.onload = function (){
                    if(this.status == 200){
                        if(this.response == "1"){
                            reject(this.response);
                        }
                        else{
                            resolve(this.response);
                        }
                    }
                    else{
                        reject(this.statusText);
                    }
                };
            });
            return prom;
        }
    };
    return {
        'get' : function(){
            return xhr.rq('GET', url);
        }
    };
}

但是我想抽象 ajax.onload 上的函数作为回调传递,我在想这样的事情:

function ajax(url, checker){
    var xhr = {
        rq : function (method, url){
            var prom = new Promise(function (resolve, reject){
                var client = new XMLHttpRequest();
                //only accept 
                client.open(method,url,true);
                client.send();
                client.onload = checker;
                };
            });
            return prom;
        }
    };
    return {
        'get' : function(){
            return xhr.rq('GET', url);
        }
    };
}

function chk1(){
    if(this.status == 200){
        if(this.response == "1"){
            reject(this.response);
        }
        else{
            resolve(this.response);
        }
    }
    else{
        reject(this.statusText);
    }
}

不幸的是,我得到了 resolve 和 reject are unknown 的错误。我知道问题只是在 chk1 中 promise 是未知的。但是我不确定如何解决它。

我希望能够这样调用它:

Promise.all([ajax(u,chk1).get(),ajax(v,chk1).get()])
.then(callback.success)
.catch(callback.error);

亲切的问候

最佳答案

您可以将 resolvereject 传递给检查器函数,以便它可以根据需要调用它们。

function ajax(url, checker) {
    var xhr = {
        rq: function(method, url) {
            var prom = new Promise(function(resolve, reject) {
                var client = new XMLHttpRequest();
                //only accept 
                client.open(method, url, true);
                client.send();
                client.onload = function() {
                    checker.call(this, resolve, reject);
                };

            });
            return prom;
        }
    };
    return {
        'get': function() {
            return xhr.rq('GET', url);
        }
    };
}

function chk1(resolve, reject) {
    if (this.status == 200) {
        if (this.response == "1") {
            reject(this.response);
        } else {
            resolve(this.response);
        }
    } else {
        reject(this.statusText);
    }
}

关于javascript - 在外部回调中解决/拒绝 Promis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685261/

相关文章:

Javascript:全局变量不起作用。 (使用SDK.REST.retriveMultipleRecords)

javascript - 使用 Reactjs Chartjs 和 axios 创建图表

node.js - async.map 不会在 nodejs 中调用回调

javascript - 将数组作为对象的一部分传递给 Ajax 调用

java - Android takePicture 不调用回调方法 onPictureTaken()

javascript - 在 'chrome.tabs.executeScript()' 中传递选项卡 ID

javascript - 从 AWS 中的参数存储中获取值

javascript - 更改模态加载的 url

jquery - 将哈希值传递给 Jquery .load() 函数

javascript - $ ('#id' ).html(x) 与 el.innerHTML = x 有什么不同