如何解决jQuery中的promise链?

时间:2016-12-23 14:02:50

标签: javascript jquery promise

我使用jQuery并获得4 promises的对象作为响应,现在如何获得每个promise的resolve值?在角度我可以使用$q.all(),在.then()它将解析所有值;但这在jQuery中不起作用。然后。下面是代码段

var _service = function() {};
var ec2;

_service.prototype = {

    init: function(formdata, cb) {
        console.info('::init::', arguments[0]);           
        ec2 = new AWS.EC2(ec2_config);
        return ec2.promise();
    },
    loop: function(param) {
        console.info('createAdditionalResources params:', arguments);
        return $.when({
            'fun1': this.fun1(param),
            'fun2': this.fun2(param),
            'fun3': this.fun3(param),
            'fun4': this.fun4(param)       
        }).done(function(response) {
            console.log('Done All');
            return response;
        });
    },
    fun1: function (param) {
        return something.promise(); //  return promise
    },
    ....
 };

window.obj = new _service();

这里我在我的脚本中调用这个函数

function foo() {
 var d = $.Deferred();

obj.init()
.then(function(res) {
    return obj.loop();
})
.then(function(res) {
    console.log(res); // this is promise chain
    d.resolve(res);
})
.catch(function(err) {
   d.reject(err);
});
return d.promise();
};

此处 res 附带此{fun1: Promise, fun2: Promise, fun3:Promise, fun4:Promise }

和fun1的值低于

fun1: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: { InternetGateway: { Attachments:[{InternetGatewayId:"igw-6253970b"}] }

现在如何解决价值?

1 个答案:

答案 0 :(得分:1)

您传递给 return $.when( this.fun1(), this.fun2(), this.fun3(), this.fun4() ).done(function(fun1, fun2, fun3, fun4) { console.log('Done All'); return {fun1, fun2, fun3, fun4}; }); 的对象不是承诺,也不是承诺,它的处理方式就像它是一个基本值:它是作为分辨率给出的。

这是一种等待解决几项承诺的方法:

function solveProps(obj){
        var keys = Object.keys(obj);
        return $.when.apply($, keys.map(k=>obj[k])).done(function(){
                var     solved = {};
                for (var i=0k i<keys.length; i++) {
                        solved[keys[i]] = arguments[i];
                }
                return solved;
        });
}

您还可以编写一个小实用程序来解决所有对象属性:

    return solveProps({
            fun1: this.fun1(),
            fun2: this.fun2(),
            fun3: this.fun3(),
            fun4: this.fun4()
    });

使用此实用程序,您只需

{{1}}