2017-09-16 10 views
0

私はPromise.all()を使用して約束を返し、複数のユーザーに電子メールを送信する機能を持つモジュールを作成しています。 userSpecificOptionsのための宣言を切り替え、しかしPromise.all()は、約束ごとに同じ値を返すように解決します

After Calling:  help 
After Calling:  promises 
After Calling:  are 
After Calling:  tough 
While Resolving:  tough 
While Resolving:  tough 
While Resolving:  tough 
While Resolving:  tough 
Data: 
[ { str: 'something', user: 'tough' }, 
    { str: 'something', user: 'tough' }, 
    { str: 'something', user: 'tough' }, 
    { str: 'something', user: 'tough' } ] 

var getPromise = function(data) { 
    return new Promise((resolve, reject) => { 
     console.log("After Calling:\t\t", data.user); 
     setTimeout(function() { 
       console.log("While Resolving:\t", data.user); 
       return resolve(data); 
      }, 
      Math.random() * 1000); 
    }); 
} 

var getAllPromises = function(users, options) { 
    var promises = []; 
    users.forEach(user => { 
     var userSpecificOptions = options; 
     // var userSpecificOptions = {}; 
     userSpecificOptions.user = user; 
     promises.push(getPromise(userSpecificOptions)); 
    }); 
    return Promise.all(promises); 
} 

var userlist = ["help", "promises", "are", "tough"]; 
var commonoptions = { 
    str: "something", 
} 

getAllPromises(userlist, commonoptions) 
    .then(data => console.log("Data:\n", data)) 

これは私に次のような出力が得られます。

 // var userSpecificOptions = options; 
     var userSpecificOptions = {}; 
コードをダウンストリップ、私は次のスニペットに問題を再現することができました

が正しい結果を得ます。

After Calling:  help 
After Calling:  promises 
After Calling:  are 
After Calling:  tough 
While Resolving:  help 
While Resolving:  promises 
While Resolving:  are 
While Resolving:  tough 
Data: 
[ { user: 'help' }, 
    { user: 'promises' }, 
    { user: 'are' }, 
    { user: 'tough' } ] 

何が問題になりますか?私は、プロミスがどう働いているのか分からないことがあるかもしれないと感じています。

var userSpecificOptions = options; 

あなたはuserSpecificOptions.userに割り当てるときに、あなたが実際にoptionsを変更します。

答えて

1

はすべてuserSpecificOptionsインスタンスが同じoptionsオブジェクトを参照します。

代わりに、あなたはoptionsのコピーを取る必要があります。そして、その特定のuserSpecificOptionsオブジェクトへの変更を

var userSpecificOptions = Object.assign({}, options); 

を、optionsまたは他の変数には影響しません。

0

この問題はお約束できません。 Javascriptオブジェクトでは、参照渡しです。この場合、常に同じオブジェクトを変更し、最後の変更が行われ、同じ結果がすべて表示されることを意味します。それは存在を修正するのではなく新しいオブジェクトを作成するときにうまく動作します。

関連する問題