gpt4 book ai didi

javascript - 如何等待第 3 方 JavaScript 函数返回

转载 作者:行者123 更新时间:2023-12-01 03:41:46 24 4
gpt4 key购买 nike

给出以下代码片段

var empowerInstance = null;

function onClick_btnSendMessage() {
var childIFrame = window.document.getElementById("editorFrame");
if (!empowerInstance) {
empowerInstance = EditorAPI.getInstance(childIFrame.contentWindow, window.location.origin);
}
empowerInstance.document.hasChanged(hasChangedCallback);
}

function hasChangedCallback(returnValue) {
console.log("empowerInstance.document.hasChanged = " + returnValue.isDirty);
if (returnValue.success === true && returnValue.isDirty === true) {
empowerInstance.document.save(saveCallback);
}
}

function saveCallback(returnValue) {
console.log("empowerInstance.document.save = " + returnValue.success);
if (returnValue.success === false) {
console.log(returnValue.message);
}
}

window.addEventListener("DOMContentLoaded", function (event) {
console.log("DOM fully loaded and parsed");
if (typeof location.origin === "undefined")
window.location.origin = window.location.protocol + "//" + window.location.host;
document.getElementById("btnSendMessage").addEventListener("click", onClick_btnSendMessage);
});

我不想连接按钮,而是通过激活 Bootstrap 选项卡事件来触发代码。

$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {

onClick_btnSendMessage(); // Naive way, as this does not wait

var target = $(e.target).attr("data-EditorUrl"); // activated tab
var childIFrame = $("#editorFrame");
childIFrame.attr("src", target);

});

所以我的问题是“在更改 childIFrame 的源之前如何等待此函数完成?”。

empowerInstance.document.hasChanged(hasChangedCallback);

我从概念上理解 Promise 和 Callbacks 的使用,但编写一个能够正确运行的 promise 和回调则是另一回事。

已更新

此版本经过重构,消除了按钮处理程序,从而提高了可读性。

用法也很重要。当页面第一次加载时,它位于选项卡上。此选项卡与 iFrame 中托管的文档关联。如果用户编辑此文档然后尝试更改选项卡,我想调用脏/保存检查,然后保存后移至下一个选项卡/文档。还有一种情况是,在选项卡/文档之间切换不会导致保存,因为文档不脏。

var empowerInstance = null;

function hasChangedCallback(returnValue) {
console.log("empowerInstance.document.hasChanged = " + returnValue.isDirty);
if (returnValue.success === true && returnValue.isDirty === true) {
empowerInstance.document.save(saveCallback);
}
}

function saveCallback(returnValue) {
console.log("empowerInstance.document.save = " + returnValue.success);
if (returnValue.success === false) {
console.log(returnValue.message);
}
}

$(function () {

if (typeof location.origin === "undefined") {
window.location.origin = window.location.protocol + "//" + window.location.host;
}

$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {

var childIFrame = $("#editorFrame");
if (!empowerInstance) {
empowerInstance = EditorAPI.getInstance(childIFrame[0].contentWindow, window.location.origin);
}
empowerInstance.document.hasChanged(hasChangedCallback);// Need to wait for completion

var target = $(e.target).attr("data-EditorUrl"); // activated tab
childIFrame.attr("src", target);

});
});

谢谢你,斯蒂芬

最佳答案

我重构了您的代码,以展示如何使用 Promise 来完成此操作。

function onClick_btnSendMessage() {
var childIFrame = window.document.getElementById("editorFrame");
if (!empowerInstance) {
empowerInstance = EditorAPI.getInstance(childIFrame.contentWindow, window.location.origin);
}
var doc = empowerInstance.document;
return hasChanged(doc).then(function() { return save(doc) })
}


function hasChanged(doc) {
return new Promise(function(resolve, reject) {
doc.hasChanged(function(returnValue) {
if (returnValue.success === true && returnValue.isDirty === true) {
resolve(returnValue)
} else {
reject(returnValue)
}
})
})
}

function save(doc) {
return new Promise(function(resolve, reject) {
doc.save(function(returnValue) {
if (returnValue.success === false) {
console.log(returnValue.message);
reject(returnValue)
} else {
resolve(returnValue)
}
})
})
}

// ------

$('a[data-toggle="tab"]').on("shown.bs.tab", function(e) {

onClick_btnSendMessage().then(function() {
var target = $(e.target).attr("data-EditorUrl"); // activated tab
var childIFrame = $("#editorFrame");
childIFrame.attr("src", target);

}).catch(function(error) {
// handle the error
console.error('Error!', error)
})


});

关于javascript - 如何等待第 3 方 JavaScript 函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com