B.jsの下の部分が切れているようですので、その部分で何かしらしているのかもしれませんが、提示されている状態で終了だとすると、そもそもtest.searchがundefined
なので、test.search.textSearch('test', 1, null, null, null) でエラー起こしていませんか?
test.search.textSearchで実行させたいならB.jsは下記のような感じになるかと思います。
javascript
1test.search = (function() {
2 return {
3 // テキスト検索
4 textSearch: function(search, pageNo, treeNo, id, column) {
5 params = {
6 "search": search,
7 "pageNo": pageNo,
8 "treeNo":treeNo,
9 "id":id
10 };
11 $.ajax({
12 type: "POST",
13 url: 'data.json',
14 data: params,
15 dataType: 'json',
16 jsonpCallback: 'callback',
17 })
18 .done(function(json){
19 if(json.data && json.data.length !== 0) {
20 return json.data;
21 }
22 });
23 }
24 };
25})();
jQuery.when
jQuery.when()
jQuery.when( deferreds )
deferreds
Type: Deferred
One or more Deferred objects, or plain JavaScript objects.
公式ドキュメントではこのようになっています。
また、こちらの例 jQuery.DeferredとかjQuery.whenの使い方について ではjQuery.when
は下記のようになっています
javascript
1var hoge = $.ajax({
2 url : "~" ,//{"text" : "hoge"}を返すAPIとする
3 type : "GET",
4 dataType : "json"
5});
6
7var fuga = $.ajax({
8 url : "~" ,//{"text" : "fuga"}を返すAPIとする
9 type : "GET",
10 dataType : "json"
11});
12
13$.when(hoge, fuga).done(function(data1, data2){
14 console.log(data1[0].text); //hoge
15 console.log(data2[0].text); //fuga
16});
その上で実行しようとしていた関数test.search.textSearch
を見てみると、普通のfunctionですので、A.jsの$.when()
内で呼び出したtest.search.textSearch
がundefinedを返して終了した段階で、done()が実行されます。
$.when()
内で呼び出した関数のAjaxの処理が完了してからdone()に進めたい場合は、呼び出す関数がDeferred objectsを返すようにしなければダメかと思います。
問題のコードの場合は $.ajax()をreturnしてしまえば良いかと思います。
javascript
1// B.js
2test.search = (function() {
3 return {
4 // テキスト検索
5 textSearch: function(search, pageNo, treeNo, id, column) {
6 params = {
7 "search": search,
8 "pageNo": pageNo,
9 "treeNo":treeNo,
10 "id":id
11 };
12 // ajaxをreturnする
13 return $.ajax({
14 type: "POST",
15 url: 'data.json',
16 data: params,
17 dataType: 'json',
18 jsonpCallback: 'callback',
19 })
20 .done(function(json){
21 if(json.data && json.data.length !== 0) {
22 return json.data;
23 }
24 });
25 }
26 };
27})();
※ ただし、ajaxを返す方法だとB.jsのajax完了時に恐らくdeferred.resolveが自動的に実行されるのでしょう。A.jsのdone()
で受け取れる引数data_a
は returnで指定されたjson.data
ではなくjson
になります。
jQuery.when().done()に加工した引数を渡したい場合
Ajaxで取得した値を加工して渡したい場合はtest.search.textSearch
はdeferred.promise()を返して、deferred.resolve()
を使って引数を渡すようにする必要があるかと思います。
javascript
1// B.js
2test.search = (function() {
3 return {
4 // テキスト検索
5 textSearch: function(search, pageNo, treeNo, id, column) {
6 params = {
7 "search": search,
8 "pageNo": pageNo,
9 "treeNo":treeNo,
10 "id":id
11 };
12 var defer = $.Deferred();
13 $.ajax({
14 type: "POST",
15 url: 'data.json',
16 data: params,
17 dataType: 'json',
18 jsonpCallback: 'callback',
19 })
20 .done(function(json){
21 if(json.data && json.data.length !== 0) {
22 // defer.resolve を使ってA.jsのdone()に引数を渡す
23 defer.resolve( json.data );
24 }
25 });
26 // defer.promiseを返す
27 return defer.promise(this);
28 }
29 };
30})();
jQuery.when()を使わなくても良いかも。
こうするとtest.search.textSearch()
はDeferred Objectを返しちゃっているので、A.jsで複数の非同期書処理を行いたいのでなければ、jQuery.when
を使わずに単純に下記のように書いてしまってもOKです。
javascript
1// A.js
2function test(){
3 test.search.textSearch('test', 1, null, null, null)
4 .done(function(data_a) {
5 return data_a;
6 });
7}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/17 12:15