Javascriptの遅延(プロトタイプ)

Prototype and Twisted

JavaScriptのDeferredテーマを継続して、 Prototypeの観点から、Deferredの別の書き換えをお勧めします。 Deferred自体の詳細については、過去の2つのメモで読むことができます。 非同期プログラミング:DeferredコンセプトDeferred:すべての詳細 。 要するに、JavaScriptでのDeferredの最も一般的で便利な使用法は、AJAXまたは他のRPC-over-HTTP呼び出しで動作することです。 私の意見では、そのような状況では据え置きが不可欠です。



例に移りましょう。PrototypeAjax.Requestに基づいたJSON-RPC APIの呼び出しは、次のようにDeferredでラップできます。



var Api = Class.create({ initialize: function(url) { this.url = url; }, call: function(method, params) { var requestBody = $H({ 'method' : method, 'params' : params }).toJSON(); var d = new Deferred(); var onSuccess = function(transport) { result = transport.responseText.evalJSON(); if ('faultCode' in result && 'faultString' in result) { var err = new Error(result.faultString); err.faultCode = result.faultCode; err.faultString = result.faultString; d.errback(err); } else { result = result[0]; console.log("Got result: ", result); d.callback(result); } }; var onFailure = function(transport) { d.errback(new Error("API transport error: " + transport.status)) }; var onException = function(error) { d.errback(error); } new Ajax.Request(this.url, { method: 'post', postBody: requestBody, requestHeaders: { 'Content-Type' : 'application/json' }, onSuccess: onSuccess, onFailure: onFailure, onException: onException, }); return d; }, });
      
      





ここで、 Api.call



へのApi.call



は、新しいDeferredによって返されます。これには、リモート呼び出しまたは例外(トランスポートまたはアクセスしているサーバーから)の結果が含まれます。 RPC呼び出しsum



およびmult



があり、それぞれ引数を追加および乗算するとします。 次に、 Api



クラスを使用した式(2+3)*7



の計算は次のようになります。



  var api = new Api; api.call('sum', [2, 3]) .addCallback( function (sum_of_2_and_3) { return api.call('mult', [sum_of_2_and_3, 7]); }) .addCallback( function(result) { alert('(2+3)*7 = ' + result); }) .addErrback( function (error) { alert('Mmm… something wrong happened: ' + error); });
      
      





まあ、最も重要なこと:




All Articles