经过一些实验,我最终得到了以下代码,试图复制C#等待功能:
var promise = new WinJS.Promise(MyFunc())
.then(function () {
// Second function which uses data set-up in the first
MyFunc2();
});
'MyFunc()'正确执行,但'MyFunc2()'没有,程序崩溃。我对Promise对象的误解是什么?
(这是使用Windows 8)
编辑:
MyFunc()的完整代码如下:
function MyFunc() {
var foldername = "Folder";
var filename = "readme.xml";
var promise = Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync(foldername).then(function (folder) {
folder.getFileAsync(filename).then(function (file) {
var loadSettings = new Windows.Data.Xml.Dom.XmlLoadSettings;
loadSettings.prohibitDtd = false;
loadSettings.resolveExternals = false;
Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file, loadSettings).then(function (doc) {
dataText = doc.getXml();
xmlDoc = doc;
}, function (error) {
output.value = "Error: Unable to load XML file";
output.style.color = "red";
}, function (error) {
output.value = "Error: Unable to load XML file";
output.style.color = "red";
})
})
});
return promise;
};
现在结果是'MyFunc2()'在'MyFunc()'完成之前执行。 `MyFunc2()使用全局变量xmlDoc,因此当时未定义。
答案 0 :(得分:3)
你应该把所有的承诺连在一起,然后等待最后的承诺。
function MyFunc() {
var promise = Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync(foldername).then(function (folder) {
return folder.getFileAsync(filename);
}).done(function (file) {
var loadSettings = new Windows.Data.Xml.Dom.XmlLoadSettings;
loadSettings.prohibitDtd = false;
loadSettings.resolveExternals = false;
return Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file, loadSettings);
}).then(function (doc) {
dataText = doc.getXml();
xmlDoc = doc;
return doc; // whatever the result is
}, function (error) {
output.value = "Error: Unable to load XML file";
output.style.color = "red";
});
return promise;
}
然后你可以链接MyFunc
:
var promise = MyFunc().then(function(doc) { MyFunc2(...); });
答案 1 :(得分:1)
好了,鉴于编辑,您将不得不使用略有不同的方法。您需要使MyFunc()实际返回您正在创建的promise变量。这样您就可以将MyFunc
链接到MyFunc2
。所以你会做这样的事情:
var promise = Windows.ApplicationModel.Package.current.installedLocation.getFolderAsync(foldername).then(function (folder) {
folder.getFileAsync(filename).done(function (file) {
var loadSettings = new Windows.Data.Xml.Dom.XmlLoadSettings;
loadSettings.prohibitDtd = false;
loadSettings.resolveExternals = false;
Windows.Data.Xml.Dom.XmlDocument.loadFromFileAsync(file, loadSettings).then(function (doc) {
dataText = doc.getXml();
xmlDoc = doc;
}, function (error) {
output.value = "Error: Unable to load XML file";
output.style.color = "red";
});
...
return promise;
假设这是MyFunc()
中的唯一承诺。如果没有,您可以将所有承诺链接在一起,或者将它们全部放在一个数组中并返回,例如WinJS.Promise.join(promiseArray)
。
现在您要从MyFunc()返回一个承诺,您可以使用then
来链接它。
var promise = MyFunc().then(function () {
// Second function which uses data set-up in the first
MyFunc2();
});
如果MyFunc2
也包含异步代码,您也可以返回这些承诺,并在需要时保持链接。
var promise = MyFunc().then(function () {
// Second function which uses data set-up in the first
return MyFunc2();
}).then(function () {
//And on and on...
});