2016-12-23 2 views
2

Iam с помощью jQuery и получить объект 4 promises в ответ, теперь, как получить значение разрешения для каждого обещания? в угловом я могу использовать $q.all() и на .then() он разрешит все значения; но это не работает в jQuery. 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(); 
}; 

здесь Рез приходит с этим {fun1: Promise, fun2: Promise, fun3:Promise, fun4:Promise }

и fun1 имеет ниже значения

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

теперь как разрешить значение?

+0

да вы правы; в 1-м фрагменте, я просто добавлю в случае необходимости? Я спрашиваю, нужен ли он нам или нет? во втором фрагменте; Я использую 'd.resolve (response)' в последнем **, затем ** block и 'd.reject' в ** catch ** block, а не' return d.promise() '.let me обновить второй фрагмент –

+0

Учитывая, что (по крайней мере, в 'fun1') вы все равно используете собственные обещания, почему бы просто не пойти на' Promise.all' ?! – Bergi

ответ

1

Объект, который вы передаете $.when, не является обещанием и не обещает, он обрабатывается так, как если бы он был базовым значением: оно дается как разрешение.

Вот способ ждать разрешения несколько обещаний:

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() 
    }); 
+0

Могу ли я использовать значение ключа для этой функции? как 'fun1: this.fun1', поскольку я получаю все 4 ответа в обещании –

+0

Конечно. Я отредактировал для этого –

+0

Вы также можете сделать утилиту, чтобы все свойства объекта были решены как обещания, если хотите. Мне нужно написать? –

Смежные вопросы