我正在使用几个插件,自定义小部件和一些来自JQuery的其他库.结果我有几个.js和.css文件.我需要为我的网站创建一个加载器,因为它需要一些时间来加载.如果我可以在导入所有之前显示加载器,那将是很好的:
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/myFunctions.js"></script>
<link type="text/css" href="css/main.css" rel="stylesheet" />
...
....
etc
Run Code Online (Sandbox Code Playgroud)
我找到了几个教程,使我能够异步导入JavaScript库.例如,我可以这样做:
(function () {
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'js/jquery-ui-1.8.16.custom.min.js';
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我对我的所有文件做同样的事情时,页面不起作用.我一直在努力试图找到问题的所在,但我找不到它.首先我认为这可能是因为一些javascript函数依赖于其他函数.但是我使用超时功能以正确的顺序加载它们,当一个完成后我继续下一个并且页面仍然表现得很奇怪.例如,我无法点击链接等...动画仍然有效..
这就是我一直在想的......我相信浏览器有一个缓存,这就是为什么第一次加载页面需要很长时间以及下次快速加载页面的原因.所以我想要做的是用一个异步加载所有这些文件的页面替换我的index.html页面.当ajax完成后,将所有这些文件重定向到我计划使用的页面.使用该页面时,加载时间不应太长,因为文件应该包含在浏览器的缓存中.在我的索引页面(异步加载.js和.css文件的页面)我不关心错误.我将只显示一个加载器并在完成后重定向页面...
这个想法是一个很好的选择吗?或者我应该继续尝试实现异步方法?
我加载所有异步的方式就像:
importScripts();
function importScripts()
{
//import: jquery-ui-1.8.16.custom.min.js
getContent("js/jquery-1.6.2.min.js",function (code) {
var s = document.createElement('script');
s.type = 'text/javascript';
//s.async = true;
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext1,1);
});
//import: jquery-ui-1.8.16.custom.min.js
function insertNext1()
{
getContent("js/jquery-ui-1.8.16.custom.min.js",function (code) …Run Code Online (Sandbox Code Playgroud) 我最近看到了一些看起来像这样的代码(当然sock是一个套接字对象):
sock.shutdown(socket.SHUT_RDWR)
sock.close()
Run Code Online (Sandbox Code Playgroud)
在套接字上调用shutdown然后关闭它的目的究竟是什么?如果它有所不同,则此套接字用于非阻塞IO.
我正在学习Web API堆栈,我正在尝试使用Success和ErrorCodes等参数以"Result"对象的形式封装所有数据.
然而,不同的方法会产生不同的结果和错误代码,但结果对象通常会以相同的方式实例化.
为了节省一些时间并且还要了解有关C#中的异步/等待功能的更多信息,我试图将我的web api操作的所有方法体包装在一个异步操作委托中,但是陷入了一些障碍......
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个方法,对Result对象执行操作并返回它.通常通过同步方法
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是如何使用async/await将此方法转换为异步方法?
这是我尝试过的:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) …Run Code Online (Sandbox Code Playgroud) 许多Cocoa和CocoaTouch方法都有完成回调,实现为Objective-C中的块和Swift中的闭包.但是,在Playground中尝试这些时,永远不会调用完成.例如:
// Playground - noun: a place where people can play
import Cocoa
import XCPlayground
let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() {
response, maybeData, error in
// This block never gets called?
if let data = maybeData {
let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
println(contents)
} else {
println(error.localizedDescription)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在我的Playground时间轴中看到控制台输出,但是println我的完成块永远不会被调用...
一个简单的问题:是否可以返回值AsyncTask?
//AsyncTask is a member class
private class MyTask extends AsyncTask<Void, Void, Void>{
protected Void doInBackground(Void... params) {
//do stuff
return null;
}
@Override
protected void onPostExecute(Void result) {
//do stuff
//how to return a value to the calling method?
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的Activity/ Fragment:
// The task is started from activity
myTask.execute()
// something like this?
myvalue = myTask.getvalue()
Run Code Online (Sandbox Code Playgroud)
编辑:这是很久以前我不熟悉Java的问题,现在我对它更好了,我会做一个简短的总结:
异步任务的重点是任务是asynchronous,这意味着在您调用execute()任务之后,任务开始在自己的线程上运行.从asynctask返回一个值是没有意义的,因为原始调用线程已经继续做其他事情(因此任务是异步的).
想想时间:在某个时间点,您启动了一个与主线程并行运行的任务.当并行运行任务完成时,主线程上也经过了时间.并行任务无法及时返回以将值返回给主线程.
我是从C来的,所以我对此并不了解.但似乎很多人都有同样的问题,所以我想我会稍微澄清一下.
假设您维护一个公开函数的库getData.您的用户将其调用以获取实际数据:
var output = getData();
在引擎盖下,数据保存在文件中,因此您getData使用内置的Node.js 实现fs.readFileSync.很明显这两个getData和fs.readFileSync是同步的功能.有一天,您被告知要将基础数据源切换到MongoDB等只能异步访问的仓库.您还被告知要避免惹恼您的用户,getData不能更改API以仅返回承诺或要求回调参数.你如何满足这两个要求?
使用回调/保证的异步函数是JavasSript和Node.js的DNA.任何非平凡的JS应用程序都可能充满了这种编码风格.但这种做法很容易导致所谓的厄运金字塔回调.更糟糕的是,如果调用链中任何调用者中的任何代码都依赖于异步函数的结果,那么这些代码也必须包含在回调函数中,对调用者施加编码样式约束.我不时发现需要将异步功能(通常在第三方库中提供)封装到同步功能中,以避免大规模的全局重新分解.搜索关于此主题的解决方案通常最终得到Node Fibers或从中派生的npm包.但纤维无法解决我所面临的问题.甚至纤维作者提供的例子说明了这一缺陷:
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Run Code Online (Sandbox Code Playgroud)
实际产量:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Run Code Online (Sandbox Code Playgroud)
如果函数Fiber确实将异步函数sleep转为同步,则输出应为:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in …Run Code Online (Sandbox Code Playgroud) 我试图研究应该如何编写完全异步的函数.经过大量文档的大量工作后,我仍然不清楚.
如何为Node编写异步函数?我该如何正确实现错误事件处理?
问我问题的另一种方法是:我应该如何解释以下功能?
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
Run Code Online (Sandbox Code Playgroud)
另外,我发现SO上的这个问题("如何在node.js中创建非阻塞异步函数?")很有趣.我觉得它还没有得到回答.
有人可以解释这对同步方法意味着什么吗?如果我尝试改变方法async然后VS抱怨它.
这有效:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我想知道这究竟是什么意思: Task.FromResult<object>(null);
我正在尝试使用Node版本6.2.1和我的一些代码.计划将大多数面向超回调的代码迁移到看起来更干净且可能表现更好的代码.
我不知道为什么,当我尝试执行节点代码时终端抛出错误.
helloz.js
(async function testingAsyncAwait() {
await console.log("Print me!");
})();
Run Code Online (Sandbox Code Playgroud)
日志 -
BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js
/Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1
(function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() {
^^^^^^^^
SyntaxError: Unexpected token function
at Object.exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:513:28)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Function.Module.runMain (module.js:575:10)
at startup (node.js:160:18)
at node.js:456:3
BOZZMOB-M-T0HZ:rest bozzmob$ node -v
v6.2.1
Run Code Online (Sandbox Code Playgroud)
我错过了什么?请给我一些启示.
更新1:
我尝试使用Babel作为Quentin建议,但是,我仍然收到以下错误.
更新的代码 -
require("babel-core/register");
require("babel-polyfill");
(async function testingAsyncAwait() {
await console.log("Print …Run Code Online (Sandbox Code Playgroud) 这是来自Google Adsense应用程序页面的示例.主页面显示之前显示的加载屏幕.
我不知道如何使用React做同样的事情,因为如果我使用React组件呈现加载屏幕,则在页面加载时它不会显示,因为它必须等待之前呈现的DOM.
更新:
我通过index.html在React componentDidMount()生命周期方法中放入屏幕加载器并将其删除来举例说明我的方法.
asynchronous ×10
javascript ×4
async-await ×3
node.js ×3
c# ×2
ajax ×1
android ×1
c#-5.0 ×1
callback ×1
closures ×1
express ×1
html ×1
html5 ×1
java ×1
node-fibers ×1
python ×1
reactjs ×1
redux ×1
return ×1
sockets ×1
swift ×1
synchronous ×1