1

現在、サーバーに保存されている製品情報にアクセスするために、Webショップアプリケーション用のJSクラスを作成しています。情報は非同期でロードする必要があります。このために私は使用しますdojo.xhrPost()。このクラスの関数を書き直したいと思います。この関数はgetProductName(productId:int):String、指定された製品IDの製品名を返します。関数はinternを使用しdojo.xhrPost()ます。しかし、ロードしてエラーを発生させるために新しい関数を渡す必要があるため、ロードされた製品名を返す必要がありますdojo.xhrPost()か?

この関数の使用法:他のJS関数はこれを呼び出して製品名をロードし、ページ全体をリロードせずにカートのWebページを更新します。エラー処理のためにいくつかの追加情報が転送されるため、返されるデータはJSON形式です(クライアント関数は、サーバー側でエラーが発生したかどうかを知る必要があります)。

関数のコードgetProductName(productId:int)

      function getProductName(productId) {
         dojo.xhrPost({
            url: '/shop/dataProduct.php',
            handleAs: 'json',
            content: {productId:productId},
            load: function(response, ioArgs) {
                 if (!response.error) {
                    // here I would like to return response.data to the caller of myObj.getProductName(productId)
                 } else {
                    // here I would like to return "error" to the caller of myObj.getProductName(productId)
                 }
                 return response;
            },
            error: function(response, ioArgs) {
                // here I would like to return "error" to the caller of myObj.getProductName(productId)
                return response;
            }
         });
      }

使用法:

           var productName = myObj.getProductName(5);
4

1 に答える 1

0

次のコード行の問題は、製品名の取得が同期的であると想定していることです。しかし、名前を取得するために ajax 呼び出しを行っているため、コードは非同期です。

var productName = myObj.getProductName(5);

dojo/Deferred非同期呼び出しを処理するために使用する必要があります。

function getProductName(productId) {

     var d = new dojo.Deferred();

     dojo.xhrPost({
        url: '/shop/dataProduct.php',
        handleAs: 'json',
        content: {productId:productId},
        load: function(response, ioArgs) {
             if (!response.error) {
                var productName = ???;
                d.resolve(productName);
             } else {
                d.reject(response.error);
             }
        },
        error: function(err) {
            d.reject(err);
        }
     });

     return d;
}

使用法:

getProductName(1).then(
  function(productName) {
     // do something with product name

  }, function(error) {
     // handle error
  });

http://dojotoolkit.org/reference-guide/1.8/dojo/Deferred.html

于 2013-03-16T11:51:14.863 に答える