我的.js文件中有以下内容
Sub test()
Dim Sendrng As Range
Dim outlookApp As Outlook.Application
Dim outlookMail As Outlook.MailItem
Dim i As Integer
For i = 2 To ActiveSheet.Cells(5, 2).Value + 1
Set Sendrng = ActiveSheet.Range("B12:K29")
Set outlookApp = New Outlook.Application
Set outlookMail = outlookApp.CreateItem(olMailItem)
With outlookMail
.To = ActiveSheet.Cells(7, 2).Value
.Subject = ActiveSheet.Cells(8, 2).Value
'.HTMLBody = Sendrng
.Save
End With
i = i + 1
ActiveSheet.Cells(4, 2) = i
Set outlookMail = Nothing
Set outlookApp = Nothing
Next i
'I want to start every time in position 2
ActiveSheet.Cells(4, 2) = 2
End Sub
现在getRooms()似乎工作正常,当我测试我的整个代码时,控制台会打印它应该打印的内容。但是我想在控制台上打印出来的东西,而不是在那里打印它来替换我的' h3'带有'标题'的元素id那个。 原来我的元素是id' title'并标记' h3'最终得到文本[object Object]而不是我想要的文本。
我怎样才能解决这个问题?谢谢
答案 0 :(得分:3)
看起来你遇到了一个关于Javascript最有趣的事情:回调函数!不幸的是,正如您所发现的,api.rooms.getRooms().done
(实际上,.done().fail
)的实际返回值并不那么有用。可能你的意思是:
$(document).ready(function() {
api.rooms.getRooms().done(function(data) {
var rooms = JSON.stringify(data);
console.log(rooms);
$("#title").text(rooms); // <<< sets the DOM element <<<
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log("Request failed: jqXHR.status=" + jqXHR.status + ",
textStatus=" + textStatus + ", errorThrown=" + errorThrown);
});
});
当api.getRooms().done()
返回时,可能它实际上还没有发出网络请求!它的作用是达成协议,如果数据成功恢复,它将调用此函数:
function(data) {
var rooms = JSON.stringify(data);
console.log(rooms);
$("#title").text(rooms); // <<< sets the DOM element <<<
}
这是JS中非常常见的风格。网络请求需要很长时间,我们可能希望在等待请求完成时执行其他操作。解决方案是传入一个function(data)
,它将告诉JS在data
准备好后该做什么。这些函数的实际返回值并未使用且无关紧要。 1
这是异步编程的一部分:不是在return rooms;
函数的末尾使用callback
,而是在数据返回后调用另一个函数$("#title").text(rooms);
来实际执行某些操作。
有关延续传递样式的更多示例(我在这里使用过),以及有关回调地狱的信息以及避免它的方法,这些文章可能会指引您进入新的方向来推进您的学习:
1 使用返回值的地方是挂起.done()
和.fail()
来电的便利地点。这就是你所看到的[object Object]
。分配完成和失败回调后,您将永远不再需要该对象。
从理论上讲,该对象不是延续传递风格的必要部分,并非每个库都以这种方式工作。它只是让你链接.done()
和.fail()
调用(它们也返回该对象,用于链接)并使你的代码看起来很漂亮。设计者也可以为请求创建完成和失败的回调参数,这在代数上更简单,但在实践中更难阅读:
api.rooms.getRooms(function done(data) {...}, function fail(...) {...})
答案 1 :(得分:0)
您需要告诉要打印的对象的属性。 Stringify将对象的内容转换为字符串。所以如果你想要你的标题属性,那就做类似的事情。
$('#my_h3').text( data.title );
答案 2 :(得分:0)
的结果
api.rooms.getRooms().done(function(data) {
console.log(JSON.stringify(data));
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log("Request failed: jqXHR.status=" + jqXHR.status + ",
textStatus=" + textStatus + ", errorThrown=" + errorThrown);
})
是 jQuery 对象
所以,你的代码相当于
$("#title").text({})
此处的任何对象都会导致#title内容为[object Object]
Asynchrony不能是捷径......你需要做类似
的事情$(document).ready(function() {
api.rooms.getRooms().done(function(data) {
$("#title").text(JSON.stringify(data));
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log("Request failed: jqXHR.status=" + jqXHR.status + ",
textStatus=" + textStatus + ", errorThrown=" + errorThrown);
}))
});
代替