2013-01-09 57 views
3

一些實驗後,我已經結束了與下面的代碼,試圖複製C#等待功能:WinJS無極然後示數

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

不MYFUNC實際上將返回你需要的數據?還是它只是設置一些全局變量,需要在後面的函數中使用? –

+0

只是設置一些全局變量 –

+0

可能重複[等到承諾和嵌套thens完成](http://stackoverflow.com/questions/14173228/wait-until-promise-and-nested-thens-are-complete) –

回答

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(...); }); 
+0

我已編輯我的帖子,以顯示完整的代碼,因爲它現在,儘管這仍然無法正常工作。 –

+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... 
}); 
+0

看到最新的編輯 - MyFunc()確實包含異步代碼。你建議的兩種方法都會阻止它崩潰,但第二個函數在第一個函數完成之前就開始了。 –

+0

好的,我根據新的信息修改了我的答案。 –

+0

這仍然不起作用。雖然它不在MyFunc()中,但MyFuncs2()的代碼在完成之前執行。 –