2016-09-01 4 views
0

私は最終的に迷子になり、少しガイダンスを得るためにここにいます。閉鎖内でajax呼び出しの後でパブリックメソッドを公開する

アイデアをまとめると、フィードバックを取得するためにajax呼び出しを使用するクロージャー内に小さなコードを記述しています。そう...

var myFeedback = feedback(); 

は、その後、私はそうのように呼び出される公開いくつかのメソッドを必要とするようなコードが...

のみ成功メッセージの配列を返します
myFeedback.successMessages(); 

を使用します。エラーメッセージ、情報メッセージ、およびすべてのメッセージのためのメソッドがあります。

フィードバックオブジェクト全体がハードコードされていれば簡単に書き込むことができますが、私の問題はフィードバックオブジェクトがajax呼び出しから引き出されることです。過去6時間の間にさまざまなソリューションを検索して試してみた結果、ajax呼び出しのすべての値が適切に設定され、残りの関数が適切な順序で実行されている関数を最終的に配置することができました。

私の頭を包み込むことができないという問題があります...世界のどのように私はそれらを公開するメソッドオブジェクトを返すのですか? AJAXを呼び出す前は簡単でしたが、非同期の性質にするためには、別の関数の中にリターンを入れなければなりませんでしたが、基底に戻すことはできません。feedback()私は多くの方法を試みましたが、まだ成功していません。

現在、私が手にエラーは、私はfeedback()は正しかったが、私がアクセスしようとした方法についてのエラーが出るでしょう一点でそれを持っていたType error feedback(...) is undefined

... successMessages is not a function

さて、十分です話の....ここにコードです。あなたが見ることができるように、私の最後の微弱な試みがそうのように返すことだった...

methods => getFeedback => feedback

私は君たちをすることができます期待していますので、私は基本的なこと以外の連鎖と露出させるためのリターンにご理解遠素晴らしいからです私の問題についていくつか光を当てました。

var feedback = function() { 

    var methods = null; 

    var getFeedback = function (callback) { 

     $.ajax({ 
      type: "GET", 
      url: '<?= Config::get('URL') ?>ajax/feedback', 
      dataType:"json", 
     }).done(function(response) { 

      console.log("Step 1: Retrieve Messages"); 
      callback(response); 

     }).always(function(){ 

      console.log("Step 3: Return Methods"); 
      console.log(methods); 
      return methods; 

     }); 

    } 

    return getFeedback(function(response) { 

     console.log("Step 2: Log Response"); 
     console.log(response);  

     methods = { 
      "successMessages" : function() { 
       console.log(response.success); 
      }, 
      "errorMessages" : function() { 
       console.log(response.error); 
      }, 
      "infoMessages" : function() { 
       console.log(response.info); 
      }, 
      "allMessages" : function() { 
       console.log(response); 
      }, 
     }; 

    }); 

}; 

私は、注意してください私はAj​​axの結果について検証を追加すると、そのようなことでしょうが、今の私は、このバリケードを乗り越える必要があります。

ありがとうございます! jquery.ajaxは約束を返すという事実を利用し

+0

主な問題は、非同期関数($ .ajax)を持っており、$の非同期性を無視して定義したメソッドを使用すると思われます。あなたが達成したいものは比較的シンプルですが、** **これを使用するコード**は、確実に動作するように書き直す必要があります。 –

+0

@JaromandaX返信ありがとうございます。私は非同期の問題を理解しているので、私は抱えているのです。私がSOの周りに集まったことは、ajaxコールの中でコールバックを実行して、それをいくらかの約束となる変数に入れることです。私はそれを試みて、注文が正しく機能するようにしました。しかし、その方法には成功しません。何か案は? – VIDesignz

答えて

1

は、あなたが私がしましたreturn feed;場合

var feedback = function() { 
    var feed = $.ajax({ 
     type: "GET", 
     url: '<?= Config::get('URL') ?>ajax/feedback', 
     dataType:"json", 
    }); 

    return { 
     "successMessages" : function(callback) { 
      feed.then(function(response) { 
       callback(response.success); 
      }); 
      // note 1 
     }, 
     "errorMessages" : function(callback) { 
      feed.then(function(response) { 
       callback(response.error); 
      }); 
      // note 1 
     }, 
     "infoMessages" : function(callback) { 
      feed.then(function(response) { 
       callback(response.info); 
      }); 
      // note 1 
     }, 
     "allMessages" : function(callback) { 
      feed.then(function(response) { 
       callback(response); 
      }); 
      // note 1 
     } 
    }; 
}; 

使用量が

var myFeedback = feedback(); 

myFeedback().successMessages(function(success) { 
    console.log(success); 
}); 

myFeedback().errorMessages(function(error) { 
    console.log(error); 
}); 

myFeedback().infoMessages(function(info) { 
    console.log(info); 
}); 

myFeedback().allMessages(function(response) { 
    console.log(response); 
}); 

だろうと思ったかもしれないよりも、このコードではなく、より簡単になりますnote 1を入手した方が簡単です。

var myFeedback = feedback(); 

myFeedback().successMessages(function(success) { 
    console.log(success); 
}).errorMessages(function(error) { 
    console.log(error); 
}).infoMessages(function(info) { 
    console.log(info); 
}).allMessages(function(response) { 
    console.log(response); 
}); 
+0

これは真っ直ぐなブリリアントです!私は、あなたがそれを行うためのそのようなきれいで明確な方法を見たとは信じられません。私は驚いて非常に感謝しています... – VIDesignz