我遇到了问题,我无法在此代码中创建循环:
class ProductsPager
constructor: ->
this.waitformsg()
waitformsg: =>
alert 'begin'
$.ajax
type: "GET"
url: "http://0.0.0.0:3000/live/index.json"
async: true
cache: false
timeout: 1000
success: (data) ->
alert data
error: (XMLHttpRequest, textStatus, errorThrown) ->
alert "end"
waitformsg()setTimeout "waitformsg()", 0
两个arlerts用于调试。它只显示我一次:“开始”,紧接着“结束”之后没有别的。
我得出结论,最后一行是错误的,我需要找到一种在Ajax中调用方法的方法
我试图将setTimeout "waitformsg()", 0
替换为this.waitformsg()
甚至waitformsg()
,但它仍然无效。
我想展示无限的“警报”,直到成功的正确条件被收集。
答案 0 :(得分:1)
这两个:
waitformsg()
setTimeout waitformsg, 0
不起作用,因为范围内没有waitformsg
函数。
此:
setTimeout "waitformsg()", 0
不起作用,因为没有名为waitformsg
的全局函数,setTimeout
的字符串形式在全局上下文中执行字符串。我建议您忘记setTimeout
甚至有字符串形式。
您应该使用fat arrow (=>
)
waitformsg: =>
alert 'begin'
$.ajax
#...
error: (XMLHttpRequest, textStatus, errorThrown) =>
alert "end"
@waitformsg()
如果您希望错误处理程序在再次尝试之前等待一秒钟:
setTimeout @waitformsg, 1000
waitformsg
方法将在正确的上下文中运行,因为您将其定义为绑定函数。
我在这里时还有几件事情:
使用@
在CoffeeScript中比使用this
更惯用,所以你的构造函数应该是:
constructor: ->
@waitformsg()
jQuery的$.ajax
async:true
标记已被弃用,因此您应该停止使用它。 async:true
对用户来说也是一件令人讨厌的事情(特别是在循环中),所以你应该再次停止使用它。
答案 1 :(得分:0)
我还没有玩过很多咖啡,所以你可以在Javascript中做到这一点:
waitformsg: function() {
var self = this;
...
...
error: function(XMLHttpRequest, textStatus, errorThrown) {
self.waitformsg();
};
};
当您只是致电waitformsg()
时,您基本上会打电话给window.waitformsg()
。由于这不存在,您的代码无法正常工作。你不能使用this
,因为回调是异步的,所以this
的值几乎就是jQuery在调用error
回调时设置的值(如果它设置的话) 。所以你需要维护一个传递给关闭的this
的引用,你可以通过在函数的局部范围内创建一个新变量并为该变量赋值this
来实现这一点(在这种情况下,我称之为新变量self
)。然后你可以拨打self.waitformsg();
。