【发布时间】:2014-01-06 22:21:11
【问题描述】:
我有一种情况,我的 WinJS 应用程序想要调用一个可能是异步的也可能不是异步的函数(例如,在一种情况下,我需要从文件(异步)加载一些数据,但在其他时候我可以从缓存中加载同步)。
查看文档后,我可以将条件逻辑包装在如下承诺中:
A)
return new WinJS.Promise(function() { // mystuff });
或者可能像这样使用'as':
B)
return WinJS.Promise.as(function() { // mystuff });
问题是,当我调用这个函数时,我是从我的第一页的 ready() 函数中执行的,如下所示:
WinJS.UI.Pages.define("/pages/home/home.html", {
ready: function () {
Data.Survey.init().done(function (result) {
// do some stuff with 'result'
});
}
});
当它写成 'A' 时,它永远不会触发我的 done() 调用。
或者如果我在它写成'B'时调用它,它会在promise 解决之前立即执行我的done() 中的代码。它还从 result 的值看,它只是被设置为我的 init() 函数的内容,而不是被包装在一个 Promise 中。
感觉我在这里做的事情基本上是错误的,但我不确定从哪里开始寻找。
如果有帮助,这是我的 init() 函数的精简版:
function init() {
return new WinJS.Promise(function() {
if (app.context.isFirstRun) {
app.surveyController.initialiseSurveysAsync().then(function (result) {
return new WinJS.Binding.List(result.surveys);
});
} else {
var data = app.surveyController.getSurveys();
return new WinJS.Binding.List(data);
}
});
}
有人对这个有什么想法吗?我不相信“可能异步”是这里的问题,我相信承诺设置没有达到我的预期。任何人都可以在这里看到明显的错误吗?非常感谢任何反馈。
【问题讨论】:
标签: javascript asynchronous winjs promise