javascript – WinJS,从一个函数返回一个promise,它可能是也可能不是async
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – WinJS,从一个函数返回一个promise,它可能是也可能不是async,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4189字,纯文字阅读大概需要6分钟。
内容图文
![javascript – WinJS,从一个函数返回一个promise,它可能是也可能不是async](/upload/InfoBanner/zyjiaocheng/744/1c70d8a82c7d42bf885e10e2c939bd3e.jpg)
我有一种情况,我的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’,它会立即执行我的done()中的代码,然后才能解决.它还从结果的值看,它刚刚被设置为我的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);
}
});
}
有没有人对这个有任何想法?我不相信’可能或可能不是异步’是这里的问题,我相信承诺设置不是我所期望的.谁能在这里看到任何明显错误的东西任何反馈都非常感谢.
解决方法:
一般来说,如果您在完整的init例程中执行文件I / O,那些API本身会返回promise,在这种情况下,您希望从其中一个.then方法返回其中一个promise或promise.
另一方面,WinJS.Promise.as旨在将一个值包装在一个promise中.但让我更充分地解释一下.
首先,仔细阅读WinJS.Promise构造函数的文档.像许多其他人一样,你错误地认为你只是将一段代码包装在诺言中并且瞧!它是异步的.不是这种情况.传递给构造函数的函数是一个初始化程序,它接收三个参数:一个completeDispatcher函数,一个errorDispatcher函数和一个progressDispatcher函数,我喜欢调用它们.
对于永远完成成功,承诺错误或报告进度的承诺,初始化程序中的其余代码最终必须调用其中一个调度程序.这些调度程序在promise中,然后遍历并调用任何已完成/错误/进度方法,这些方法已经被赋予了该promise或者已完成的方法.因此,如果您根本没有调用调度程序,则无法完成,这正是您所看到的行为.
使用WinJS.Promise.as类似于它在promise中包含一个值.在您的情况下,如果您将一个函数传递给WinJS.promise.as,那么您将得到的是一个承诺,因此该函数值已经实现了.您没有获得该函数的异步执行.
要实现异步行为,您必须使用setTimeout / setInterval(或Windows 8.1中的WinJS调度程序)在UI线程上执行异步工作,或者使用Web worker作为后台线程并将其完成(通过postMessage)绑定到promise中.
这是使用构造函数创建promise的完整示例,处理完整,错误和进度情况(以及取消):
function calculateIntegerSum(max, step) {
if (max < 1 || step < 1) {
var err = new WinJS.ErrorFromName("calculateIntegerSum", "max and step must be 1 or greater");
return WinJS.Promise.wrapError(err);
}
var _cancel = false;
//The WinJS.Promise constructor's argument is a function that receives
//dispatchers for completed, error, and progress cases.
return new WinJS.Promise(function (completeDispatch, errorDispatch, progressDispatch) {
var sum = 0;
function iterate(args) {
for (var i = args.start; i < args.end; i++) {
sum += i;
};
//If for some reason there was an error, create the error with WinJS.ErrorFromName
//and pass to errorDispatch
if (false /* replace with any necessary error check -- we don’t have any here */) {
errorDispatch(new WinJS.ErrorFromName("calculateIntegerSum", "error occurred"));
}
if (i >= max) {
//Complete--dispatch results to completed handlers
completeDispatch(sum);
} else {
//Dispatch intermediate results to progress handlers
progressDispatch(sum);
//Interrupt the operation if canceled
if (!_cancel) {
setImmediate(iterate, { start: args.end, end: Math.min(args.end + step, max) });
}
}
}
setImmediate(iterate, { start: 0, end: Math.min(step, max) });
},
//Cancellation function
function () {
_cancel = true;
});
}
这来自我的免费电子书的附录A(“揭秘承诺”),用HTML,CSS和JavaScript编写Windows应用商店应用程序,第二版(预览版),见http://aka.ms/BrockschmidtBook2.
在您的情况下,您可以将数据初始化代码放在iterate函数的位置,也可以在setImmediate中调用它.我还建议您查看WinJS调度程序API,它可以让您在UI线程上设置工作的优先级.
简而言之,理解新的WinJS.Promise和WinJS.Promise.as本身并不会创建异步行为是至关重要的,因为promises本身只是围绕“稍后交付的结果”的调用约定,它与async没有任何内在联系. .
内容总结
以上是互联网集市为您收集整理的javascript – WinJS,从一个函数返回一个promise,它可能是也可能不是async全部内容,希望文章能够帮你解决javascript – WinJS,从一个函数返回一个promise,它可能是也可能不是async所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。