2017-04-02 4 views
-1

結果として配列を外部関数に渡そうとしていますか?ここにjsbinの作業コードがあります:https://jsbin.com/kugesozawi/edit?js,console,output結果はreturnSearchに渡されます。配列を関数から返すにはどうすればいいですか

私はコールのAJAX呼び出しが行われるたびに、あなたはそれが準備されるのを待つ必要がありますことを意味し、それはあなたが考えている値を返すようにする唯一の方法は、呼び出しが同期させることだと思い
var googleSuggest = function(returnSearch){ 

    var term = $('#searchInput').val(); 
    var result = []; 
    var service = { 
    youtube: { client: 'youtube', ds: 'yt' }, 
    books: { client: 'books', ds: 'bo' }, 
    products: { client: 'products-cc', ds: 'sh' }, 
    news: { client: 'news-cc', ds: 'n' }, 
    images: { client: 'img', ds: 'i' }, 
    web: { client: 'hp', ds: '' }, 
    recipes: { client: 'hp', ds: 'r' } 
    }; 

    $.ajax({ 
    url: 'https://clients1.google.com/complete/search', 
    dataType: 'jsonp', 
    data: { 
     q: term, 
     nolabels: 't', 
     client: service.web.client, 
     ds: service.web.ds 
    } 
    }).done(function(data) { 

     result.pop() 

     $.each(data[1], function(item, value) { 

     var stripedValue = value[0].replace(/<[^>]+>/g, ''); 

      result.push(stripedValue); 

     }) 

     console.log(result) 

    }) 

    returnSearch = ['ActionScript', 'AppleScript', 'Asp'] 

    return returnSearch 

}; 
+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-呼び出し) – Frxstrem

答えて

-1

(あなたが一般的に望まないもの)。あなたは、このような結果の呼び出し内からreturnSearch機能を呼び出すことができます。

var googleSuggest = function(returnSearch){ 
    var term = $('#searchInput').val(); 
    var service = { 
    youtube: { client: 'youtube', ds: 'yt' }, 
    books: { client: 'books', ds: 'bo' }, 
    products: { client: 'products-cc', ds: 'sh' }, 
    news: { client: 'news-cc', ds: 'n' }, 
    images: { client: 'img', ds: 'i' }, 
    web: { client: 'hp', ds: '' }, 
    recipes: { client: 'hp', ds: 'r' } 
    }; 

var promise = $.ajax({ 
    url: 'https://clients1.google.com/complete/search', 
    dataType: 'jsonp', 
    data: { 
     q: term, 
     nolabels: 't', 
     client: service.web.client, 
     ds: service.web.ds 
    } 
    }) 

    return promise 
}; 


$(function() { 
    $('#searchInput').autoComplete({ 
    minChars: 1, 
    source: function(term, suggest){ 
     var promise = googleSuggest() 
     returnSearch = function(term, choices) { 
     console.log(choices) 
     var suggestions = []; 
     for (i=0;i<choices.length;i++) 
     if (~choices[i].toLowerCase().indexOf(term)) suggestions.push(choices[i]); 
      suggest(suggestions); 
     } 

     $.when(promise).then(function(data) { 
     term = term.toLowerCase(); 
     var result = []; 
     $.each(data[1], function(item, value) { 
      var stripedValue = value[0].replace(/<[^>]+>/g, ''); 
      result.push(stripedValue); 
     }) 
     returnSearch(term, result) 
     }) 
    } 
    }); 
}) 

またthis stackoverflow postを参照してください。

+1

より良い方法は、外部関数を非同期にすることです。長時間実行される同期アクション(サーバー上のリソースを取得するなど)はイベントループをブロックし、ページを応答不能にします。フェッチを同期させるのは簡単ですが、一般にこのような理由から悪い習慣です。 – Frxstrem

+0

これは完璧なチャームのように機能しています!ありがとうございます...私はもっと約束を学ぶ必要があります。 @ Frxstreamあなたの選択肢を提案できますか? – Spyder

+1

@Spyderあなたの質問に私のコメントでリンクした質問を見てください。私が何を言っているのか説明しています。 – Frxstrem

関連する問題