javascript - 为什么我不能将 js promise resolve 包装在 jquery 对象中?

标签 javascript jquery ajax promise

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

当我运行以下代码时,我无法将 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

最佳答案

我不确切地知道你的 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 被调用,而不是传递给 .then 的预期回调。

关于javascript - 为什么我不能将 js promise resolve 包装在 jquery 对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34956801/

相关文章:

javascript - 检查输入是否为空或有文本而不是数字

javascript - 在 src 中附加 window.location

javascript - 如何获得两个div之间的距离

jquery - 根据选择事件的开始和结束更改完整日历议程 View 中的单元格背景

javascript - setTimeout jquery 中的 ajax 调用

javascript - 避免代码因 jQuery blockUI 中的 javascript 错误而暂停/卡住

javascript - jQuery :last selector for multiple list

jquery - 客户端站点上的自定义数据注释验证 : $. validator.addMethod 错误

javascript - Youtube api 事件仅适用于第一个元素

ajax - CakePHP,找不到助手类 AjaxHelper