2016-12-23 4 views
2

IamはjQueryを使って4 promisesのオブジェクトを取得しましたが、どのように各約束の解決の価値を得るのですか?私は$q.all()を使用することができ、.then()ではすべての値を解決します。しかしそれはjQueryでは動作しません。以下のコードスニペット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回目のスニペットで、必要な場合に追加するだけです。私はそれが必要かどうかを尋ねていますか? 2番目のスニペットで。私は** catch **ブロックと 'return d.promise()'の中で最後の** then **ブロックと 'd.reject'で' d.resolve(response) 'を使用しています.2番目のスニペットを更新してください –

+0

とにかくネイティブの約束を使用していることを考えれば、単に「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; 
     }); 
} 

このユーティリティを使えば、とまったくhave

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

この関数でキー値を使用できますか? 'fun1:this.fun1'のように私は約束どおりに4つの応答を得ています。 –

+0

もちろんです。私はそのために編集しました –

+0

オブジェクトのすべてのプロパティを必要に応じて約束として解決するユーティリティを作成することもできます。私はそれを書く必要がありますか? –

関連する問題