1

我目前正在为我的网上商店应用程序编写一个 JS 类,以访问存储在服务器上的产品信息。信息应异步加载。为此,我使用dojo.xhrPost(). 我想为这个类重写一个函数,调用getProductName(productId:int):String它返回给定产品 ID 的产品名称。该函数使用实习生dojo.xhrPost()。但是由于我必须将新函数传递给加载和错误,我应该返回加载的产品名称dojo.xhrPost()吗?

这个函数的使用:其他JS函数调用这个来加载产品名称来更新购物车网页,而不需要重新加载整个页面。返回的数据采用 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 回答