- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
索引.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { createStore, applyMiddleware, compose } from 'redux';
import { Provider } from 'react-redux';
import ReduxThunk from 'redux-thunk';
import reducer from './redux';
const body = document.querySelector('body'),
composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose,
store = createStore(reducer, composeEnhancers(applyMiddleware(ReduxThunk)));
ReactDOM.render(<Provider store={store}><App/></Provider>, body);
App.js
import React from 'react';
import Shortcut from './Shortcut';
export default class App extends React.PureComponent {
render() {
return <Shortcut/>;
}
}
快捷方式.js
import React from 'react';
import { connect } from 'react-redux';
import { print_date_async } from './redux';
class Shortcut extends React.PureComponent {
componentDidMount() {
window.addEventListener('keydown', (event) => {
if (event.keyCode === 13) {
this.props.print_date_async({ date: new Date().toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1") });
}
});
}
render () {
return null;
}
}
function mapDispatchToProps(dispatch) {
return {
print_date_async: (date) => dispatch(print_date_async(date))
};
}
Shortcut = connect(undefined, mapDispatchToProps)(Shortcut);
export default Shortcut;
redux.js
import { createAction, handleActions } from 'redux-actions';
export const print_date = createAction('print_date');
export function print_date_async (payload) {
return async (dispatch) => {
try {
await wait_async();
dispatch(print_date({ date:payload.date }));
}
catch (exeption) {
console.error(exeption);
}
};
}
const initial_state = { };
export default handleActions({
print_date: (state, action) => {
console.log(action.payload.date);
return { ...state }
}
}, initial_state);
function wait_async (number) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, Math.floor(Math.random() * 10000)); // 0000 ~ 9999
});
};
https://codesandbox.io/s/l7y4rn61k9
以我创建的程序为例进行说明,当您按下回车键时,您按下回车键的时间会在随机秒后输出。
我想在调用一个异步 Action 创建器之后调用下一个 Action 创建器。
如果按住回车键,第一次按下的结果也可以稍后打印。
01:42:48
01:42:48
01:42:47
01:42:47
01:42:47
01:42:47
01:42:48
我考虑过导出变量来检查状态,但我不喜欢它。我也不喜欢检查按键之间的间隔。
我想按照下面的方式来做,但是实现起来并不容易。如果你知道这件事,请回答。感谢阅读!
window.addEventListener('keydown', (event) => {
if (event.keyCode === 13) {
if (!this.proceeding) {
this.proceeding = true;
(async () => {
await this.props.print_date_async({ date: new Date().toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1") });
this.proceeding = false;
})();
}
}
});
我只需要在使用 redux-thunk 时返回 promise 对象。
export function print_date_async (payload) {
return (dispatch) => new Promise(async (resolve, reject) => {
try {
await wait_async();
dispatch(print_date({ date:payload.date }));
resolve();
}
catch (exeption) {
console.error(exeption);
reject(exeption);
}
});
}
我知道 async() 返回 promise 对象,所以你不必用 promise 包装。
最佳答案
问题是您有一个用户输入流,它创建了一个异步值流。这些值可以按照与用户输入顺序不同的顺序解析。
例如:用户点击 A、B 和 C,这会创建 Promise A、B 和 C,但它们按 C、B 和 A 的顺序解析。您希望它们按与用户操作相同的顺序解析,对吗?
使用 promises 解析来排序或加入用户生成的流非常复杂,也许 Reactive x 可以解决这个问题,但下面的代码应该可以做到:
const resolveOrderedAndFast = (function(promiseInfos,requestIndex){
const lastCall = {};
return fastHandler => orderedHandler => promise => {
requestIndex++;
promise.then(fastHandler);
promiseInfos.push([promise,orderedHandler,requestIndex]);
//only resolve when it's last call
const last = () => {
lastCall.id={};
var check = lastCall.id;
return promise.then(
resolve=>
Promise.all(
promiseInfos
.sort((x,y)=>x[2]-y[2])
.map(([p,fn,requestIndex])=>{
return p.then(
([r,seconds])=>{
return [r,seconds,fn,requestIndex];
}
)
})
).then(
(resolves)=>{
if(check===lastCall.id){
resolves.forEach(
([r,seconds,fn,requestIndex])=>
fn([r,seconds,requestIndex])
);
promiseInfos=[];
requestIndex=0;
}else{
//ignore, no problem
}
}
)
);
};
last();//only resolve the last call to this function
};
}([],0))
const later = resolveValue => {
const values = ["A","B","C"];
const index = values.indexOf(resolveValue);
return new Promise(
(resolve,reject)=>
setTimeout(
x=>resolve([resolveValue,(4-(index*2))])
,(4-(index*2))*1000
)
)
};
const fastHandler = val => ([resolve,seconds])=>
console.log(
val,
"FAST HANDLER --- resolved with:",
resolve,
"in",seconds,"seconds"
);
const orderedHandler = val => ([resolve,seconds,i])=>
console.log(
"Call id:",
i,
"ORDRED HANDLER --- resolved with:",
resolve,
"in",seconds,"seconds"
);
const valueArray = ["A","B","C","A","B","C","A"];
console.log("making request:",valueArray);
valueArray
.forEach(
val=>
resolveOrderedAndFast
(fastHandler(val))
(orderedHandler(val))
(later(val))
);
setTimeout(
()=>
console.log("making more requests:",valueArray) ||
valueArray
.forEach(
val=>
resolveOrderedAndFast
(fastHandler(val))
(orderedHandler(val))
(later(val))
)
,500
);
这是一个更简单的版本,对它的作用有更多评论:
const Fail = function(reason){this.reason=reason;};
const resolveOrderedAndFast = (function(preIndex,postIndex,stored){
return fastHandler => orderedHandler => promise => {
//call this function before the promise resolves
const pre = p=> {
preIndex++;
p.then(fastHandler);
(function(preIndex,handler){//set up post when promise resolved
//add pre index, this will be 1,2,3,4
// but can resolve as 2,4,3,1
p.then(r=>post([r,handler,preIndex]))
//because the promises are stored here you may want to catch it
// you can then resolve with special Fail value and have orderedHandler
// deal with it
.catch(e=>
post(
[
new Fail([e,r,preIndex]),//resolve to Fail value if rejected
handler,
preIndex
]
)
)
})(preIndex,orderedHandler);//closure on index and ordered handler
};
//this will handle promise resolving
const post = resolve=>{
//got another resolved promise
postIndex++;
//store the details (it's resolve value, handler and index)
stored.push(resolve);
//deconstruct the resole value
const [r,handler,i]=resolve;
//the index of the resolve is same as current index
// that means we can start calling the resolvers
if(i===postIndex){
//sort the stored by their indexes (when they stared)
stored = stored
.sort((x,y)=>x[2]-y[2])
//filter out all the ones that can be resolved
.filter(
([r,handler,i])=>{
//can be resolved, no promises have yet to be resolved
// before this index
if(i<=postIndex){
//increase the number of indexes procssed (or stored)
postIndex++;
//resolve the value again (so we don't get errors)
Promise.resolve([r,i]).then(handler);
return false;//no need to "resolve" this again, filter it out
}
return true;
}
)
}
};
pre(promise);
};
})(0,0,[])//passing in pre and post index and stored
//demo on how to use it:
const later = resolveValue => {
const values = ["A","B","C"];
const index = values.indexOf(resolveValue);
return new Promise(
(resolve,reject)=>
setTimeout(
x=>resolve([resolveValue,(4-(index*2))])
,(4-(index*2))*1000
)
)
};
const fastHandler = val => ([resolve,seconds])=>
console.log(
val,
"FAST HANDLER --- resolved with:",
resolve,
"in",seconds,"seconds"
);
const orderedHandler = val => ([[resolve,seconds],i])=>
console.log(
"Call id:",
i,
"ORDRED HANDLER --- resolved with:",
resolve,
"in",seconds,"seconds"
);
const valueArray = ["A","B","C","A","B","C","A"];
console.log("making request:",valueArray);
valueArray
.forEach(
val=>
resolveOrderedAndFast
(fastHandler(val))
(orderedHandler(val))
(later(val))
);
setTimeout(
()=>
console.log("making more requests:",valueArray) ||
valueArray
.forEach(
val=>
resolveOrderedAndFast
(fastHandler(val))
(orderedHandler(val))
(later(val))
)
,500
);
关于javascript - 如何按顺序调用异步 Action 创建者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081810/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!