2016-07-25 18 views
-1

に私のスクリプトを任意の値を返しません:約束はjqueryの

var testApp = (function($){ 
    var data = [{ 
     "layout": "getSample", 
     "view": "conversations", 
     "format": "json", 
    }]; 

    var Data = 'default'; 
    function ajaxCall(opt) { 
     return new Promise(function(resolve, reject) { 

      jQuery.ajax({ 

       method: "POST", 
       url: localStorage.getItem("root")+"/index.php", 
       "data": opt, 
       error: function() { 
        alert('error'); 
       }, 
       success: function(result) { 
        console.debug(result); 
        resolve(result); 

       }//end success 
      });//end ajax 

     });//end promise 
    } 
    return { 

     render: function(opt) { 
      if(typeof opt === 'object') { 
       var list = { 
        data : [opt] 
       } 

       //here I'm passing list object's data to be used in ajaxCall function.That's the reeason I used call method. It's data is passed from another page. 
       ajaxCall.call (list, list.data).then(function(v) { 
        console.log("v "+v); // nothing happens yet...expecting for the success object to be passed here 
       }).catch(function(v) { 
        //nothing to do yet 
       }); 


      } 
     } 

    };//end return 
})(jQuery); 

は、Ajaxとの約束を使用する正しい方法ですか?

呼ば
ajaxCall.call (list, list.data).then(function(v) { 
console.log("v "+v); // doesn't return anything 
}).catch(function(v) { 
//nothing to do yet 
}); 

How do I return the response from an asynchronous call?

+1

'jQuery.ajax()' *すでに*約束を返します。それ以外は、あなたのコードが達成すべきものが不明です。それを正しく字下げして始め、その目的、起こることを期待すること、代わりに何が起こるのかについての説明を追加してください。また、そのコメントアウトされたforループのような未使用のコードを削除してください。コード行が必要な場合、またはそうでない場合は、あなたの心を固めます。 – Tomalak

+0

@Tomalak、私は心を作り、コードを編集しました。 – 112233

答えて

0

よく、私が見つけたその簡単な修正... //コードの行の下に は、上記の移動は、新たな約束を返し、それが

VAR OPT = jQuery.extendを働きました({}、データ[0]、opt [0]);

+1

あなたの質問のコードにこの行が存在しないことがあまりにも悪いです。また、上記のコメントの最初の文についてもう一度考えてください。 'jQuery.ajax()' *はすでに約束を返しています。 – Tomalak

0

jQuery Ajax関数はすでに約束を返します。手動で約束する必要はありません。

var testApp = (function($) { 
    var ajaxDefaults = { 
     "layout": "getSample", 
     "view": "conversations", 
     "format": "json", 
    }; 

    // this can be re-used in all your Ajax calls 
    function handleAjaxError(jqXhr, status, error) { 
     console.error('Ajax error', error); 
    }); 

    function ajaxCall(opt) { 
     var url = localStorage.getItem("root") + "/index.php", 
      data = jQuery.extend({}, ajaxDefaults, opt); 

     return $.post(url, data).fail(handleAjaxError); 
    } 

    return { 
     render: function(opt) { 
      return ajaxCall(opt).then(function (result) { 
       console.log("v " + result); 
       return result; 
      }); 
     } 
    }; 
})(jQuery); 
  • あなたは、関数を呼び出すために.call()を使用する必要はありません。この場合でもそれは意味をなさない。オブジェクトメソッドではなくスタンドアロンの関数であれば、それを普通に呼び出して引数を渡します。
  • localStorage.getItem("root")に何らかの値が含まれているという保証はありませんが、コードではこの可能性は無視されます。それはバグです。
  • コード内に2つの変数dataDataは必要ありません。このようなトリップ線は設定しないでください。
  • $.post()/$.get()が1行でジョブを実行できる場合は、$.ajax()を使用する必要はありません。
  • メソッドとその.then()ハンドラから何かを返すので、アプリケーション内の他の場所でコードをさらに連結することができます。

    app.render({data: 1234}).then(function (result) { 
        // ... 
    });