【问题标题】:Why can't I wrap js promise resolve in a jquery object?为什么我不能在 jquery 对象中包装 js promise resolve?
【发布时间】:2016-01-23 07:28:28
【问题描述】:

我希望能够将成功的 jquery ajax 调用中的数据发送到我的应用程序中的其他方法,因为它非常大,并且使用一个 api 方法可以使用它使编码有意义,所以我选择尝试 Promise。这是我的第一枪。我得到了一些不错的结果,但显然我对上下文和时间仍然有些困惑。

当我运行以下代码时,我无法将来自 ajax 调用的返回数据包装为 jquery 对象而不会出现错误:

    var widgetSystem={       

       listenForClick: function(){
        $('div').on('click','a',function(){
            var $selectTarget = $(this),
                widgetid = $(this).data('widgetid');
                apiRequestData = widgetSystem.makeApiRequestForSingleWidget(widgetid);

            apiRequestData.then(function(result) {
                widgetSystem.showWidget(result);
            }).catch(function(e) {
                console.log('no way big error ' +e);
            });
        });
    },




    makeApiRequest: function(widgetid){

        return new Promise(function(resolve, reject) {
            $.ajax({
                method: "POST",
                url: "localhost",
                dataType: 'json',
                data: {
                    data: {
                       widgetId: widgetid
                    },
                    action: 'apiMethod'
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    console.log(jqXHR);
                    console.log(textStatus);
                    console.log(errorThrown);
                    reject();
                },
                success: function (data) {
                    resolve(data);
                }
            });
        });
    },

    showWidget: function(data){
        $(data).appendTo('body');
        //this causes an exception in my apiRequestData.then function in listenForClick
    }

}

我正在运行未缩小的 jquery,并在我的控制台中收到以下错误:

不可能有大错误 TypeError: context is undefined

【问题讨论】:

  • 当你在这里写console.log(data)showWidget: function(data){...时会显示什么
  • 它在控制台中为我提供了一个不错的大对象,完全符合我的预期!对象 { widget="
    \r\n
  • 不确定context is undefined 的确切来源,但我会说这实际上可以大大简化。 $.ajax 本身返回一个 Promise,Promise 结果和 Promise 错误都可以很容易地转换为新形式(例如,您希望将大型 JSON 结构简化为重要的标识符)。 .then 返回一个 promise,表示传递给 .then 的函数的返回值,真的很方便。
  • 您是否尝试过反转? $('body').append(data);?
  • 成功了吗?喜欢$("body").append(data.widget)?

标签: javascript jquery ajax promise


【解决方案1】:

我不确切知道您的 HTML 是什么样子或 API 是如何设置的,但假设 API 工作正常并且通过 POST 发送的数据是正确的,我可以使用 jsonplaceholder 让它工作api 代码如下(你可以在JSbin找到它)。

var widgetSystem={       
  listenForClick: function(){
    $('div').on('click','a',function(){
      console.log('clicked');
      var $selectTarget = $(this);
      var widgetid = $(this).data('widgetid');


      widgetSystem.makeApiRequest(widgetid)
        .then(function(result) {
          widgetSystem.showWidget(result);
          return result;
        })
        .catch(function(e) {
          console.log('no way big error ' +e);
        });
    });
  },


  makeApiRequest: function(widgetid){
    return new Promise(function(resolve, reject) {
      var root = 'http://jsonplaceholder.typicode.com';
      $.ajax({
        method: "POST",
        url: root+'/posts/',
        dataType: 'json',
        data: {
          userId:1,
          title:"Havanagila",
          body:"Testing the greatness"
        },
        success: function(xData, status){
          resolve(xData);
          //reject('whoops');
        },
        error: function(xhr, status, error){
          reject(status);
        }
      });
    });
  },

  showWidget: function(data){
    $('#space').append(document.createTextNode(JSON.stringify(data)));
  }
}

widgetSystem.listenForClick()

我认为在 ajax success 回调中如何调用 resolve(data) 不存在问题。发送到您的 API 的数据可能存在问题,因此调用了 error 回调,这反过来又调用了 reject 并导致调用传递给 .catch 的回调而不是传递给 @ 的预期回调987654329@.

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签