【发布时间】: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