Stringify返回Object对象?

时间:2018-05-09 23:24:28

标签: javascript jquery html ajax

我的.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]而不是我想要的文本。
我怎样才能解决这个问题?谢谢

3 个答案:

答案 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);
    }))
});

代替