我使用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"}] }
现在如何解决价值?
答案 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}}