###実現したいこと
該当のソースコードで次のように並列で処理しています。
js
1 Promise.all([ 2 wrap( func1 ), // 引数を渡したい 3 wrap( func2 ) 4 ])
これに引数'apple'
を渡して次のような実行をしたいのですが、こうするとエラーになります。
js
1 Promise.all([ 2 wrap( func1('apple') ), // こうするとエラー 3 wrap( func2 ) 4 ])
###該当のソースコード
以下の11行目が引数'apple'
を渡したい行です。
js
1// func1, func2 を並列処理しつつ、結果は順次処理していく 2$(function() { 3 4 // 結果は順次処理 5 const wrap = async function(func) { 6 const res = await func(); 7 console.log(res); 8 return res; 9 } 10 11 // func1, func2 を並列処理 12 console.log("並列処理開始"); 13 Promise.all([ 14 wrap( func1 ), // 引数を渡したい 15 wrap( func2 ) 16 ]).then(res=>{ 17 console.log(res); 18 console.log("並列処理すべて終了"); 19 }); 20 21 // AJAXでデータを取得 22 function func1(str=''){ 23 var def = new $.Deferred(); 24 console.log('start func1') 25 setTimeout(function(){ 26 const ajaxResponse1 = [{name:str+'太郎'},{nane:str+'次郎'}]; 27 def.resolve( ajaxResponse1 ); 28 },1000); 29 return def.promise(); 30 } 31 32 // AJAXでデータを取得 33 function func2(){ 34 var def = new $.Deferred(); 35 console.log('start func2'); 36 setTimeout(function(){ 37 const ajaxResponse2 = [{name:'花子'},{nane:'良子'}]; 38 def.resolve( ajaxResponse2 ); 39 },2000); 40 return def.promise(); 41 } 42 43});
###発生している問題・エラーメッセージ
引数'apple'
を渡すと次のエラーになります。
Uncaught (in promise) TypeError: func is not a function
###考察・試したこと
正しいかわかりませんが、
wrap( func1 )
を
wrap( func1('apple') )
とすると、wrap
の中で()
があるためにこの時点で関数func1
が実行されてしまうことが原因か?と考えています。
なので
wrap( "func1('apple')" )
という風に文字列で渡すようにして、eval
で文字列を関数として処理する方法を試しました。
js
1$(function() { 2 3 // 結果は順次処理 4 const wrap = async function(func) { 5 const res = await eval(func); // evalで文字列を関数として処理する 6 console.log(res); 7 return res; 8 } 9 10 // func1, func2 を並列処理 11 console.log("並列処理開始"); 12 Promise.all([ 13 wrap( "func1('apple')" ), // 文字列で渡す 14 wrap( "func2()" ) // 同じく文字列で渡す 15 ]).then(res=>{ 16 console.log(res); 17 console.log("並列処理すべて終了"); 18 }); 19 20/*-- 以下略 --*/
###質問
これによって実現できたように思えるのですが、eval
は避けるべきとの記事を方々で目にします。
そこでeval
を使うことなく引数'apple'
を渡す方法を知りたいのですが、そのようなことは可能でしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/26 15:56 編集