我目前正在研究React JS和React Native框架.当我读到Facebook的Flux和Redux实现时,在中途遇到Immutability或Immutable-JS库.
问题是,为什么不变性如此重要?变异对象有什么问题?它不简单吗?
举一个例子,让我们考虑一个简单的新闻阅读器应用程序,其中开始屏幕是新闻标题的列表视图.
如果我设置说最初具有值的对象数组,我无法操纵它.这就是不变性原则所说的,对吧?(如果我错了,请纠正我.)但是,如果我有一个必须更新的新的新闻对象怎么办?通常情况下,我可以将对象添加到数组中.在这种情况下我该如何实现?删除商店并重新创建它?是不是将一个对象添加到数组中的操作更便宜?
PS:如果这个例子不是解释不变性的正确方法,请让我知道什么是正确的实际例子.
javascript functional-programming immutability reactjs immutable.js
我正在尝试使用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) 我已经在我的应用程序中使用ES6和ES7功能(感谢Babel) - 包括移动和网络.
第一步显然是ES6级别.我学到了很多异步模式,承诺(很有前途),生成器(不确定为什么是*符号)等等,其中,Promises非常适合我的目的.而且我一直在我的应用程序中使用它们.
这是我如何实现基本承诺的示例/伪代码 -
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
Run Code Online (Sandbox Code Playgroud)
随着时间的流逝,我碰到ES7的功能,并将它们作为一个ASYNC和AWAIT关键字/功能.这些结合起来有很大的奇迹.我已经开始取代我的一些承诺了async & await.它们似乎为编程风格增添了很多价值.
同样,这里是我的async,await函数看起来像的伪代码 -
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
Run Code Online (Sandbox Code Playgroud)
保持语法错误(如果有的话),他们两个做同样的事情是我的感觉.我几乎能够用异步替换我的大部分承诺,等待着.
我的问题是,为什么异步,等待Promises做类似的工作?async,等待解决更大的问题吗?或者它只是回调地狱的另一种解决方案?正如我之前所说,我能够使用Promises和Async,Await来解决同样的问题.是否存在Async Await解决的具体内容?
附加说明:我一直在我的ReactJS项目和节点模块中广泛使用Async,Awaits和Promises.ReactJS特别是早期的鸟类,并采用了很多ES6和ES7功能.
我正在为开源项目做贡献,我正在为React Native开发材料设计.我在工作中被阻止,我无法通过填充,对齐等方式进行一些UI级别的增强,
这是抽屉材料设计的官方规格 -
在上图中,测量单位是dp.
但是,在我的React Native代码中,我看到没有提到这样的单位.考虑到它是"反应原生"我很困惑它是px还是dp.
我甚至浏览了React Native for Style组件的官方文档.我没有在任何地方看到提及.
我的守则看起来像 -
const styles = {
touchable: {
paddingHorizontal: 16,
marginVertical: 8,
height: 48
},
item: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
},
icon: {
position: 'relative',
},
value: {
flex: 1,
paddingLeft: 34,
top: 2
},
label: {
top: 2
}
},
Run Code Online (Sandbox Code Playgroud)
如果这是像素或dp,你能告诉我吗?而且,是1px = 1dp吗?
我使用JSON结构来存储一个人的详细信息.基本上名称,电话,registeredTimestamp等将是其他属性,主键将是电子邮件地址.
markedLocations,visitedLocations,searchHistory和recommended是AWS调用它的列表或映射.它将包含许多JSON对象.
JSON结构 -
{
"name":"Mama Miya",
"phone":"9383883223",
"registeredTimestamp":"some-time",
"lastActiveTimestamp":"some-time",
"signinType":"facebook",
"additionalSigninData":{
"key1":"value1",
"key2":"value2"
},
"markedLocations":[
{
"latitude":"77.33",
"longitude":"12.33",
"name":"Home",
"description":"my new home",
"placeid":"55334433",
"image":"url/abc.png"
}
]
}
Run Code Online (Sandbox Code Playgroud)
在应用程序中,如果用户访问新位置,我需要向markedLocations添加新的JSON对象.因此,标记的地点应该看起来像 -
"markedLocations":[
{
"latitude":"77.33",
"longitude":"12.33",
"name":"Home",
"description":"my new home",
"placeid":"55334433",
"image":"url/abc.png"
},{
"latitude":"22.11",
"longitude":"22.55",
"name":"Ocean",
"description":"Ocean",
"placeid":"32423423",
"image":"url/icean.png"
}
]
Run Code Online (Sandbox Code Playgroud)
代码/ Schema-
var item = {
'email': {'S': req.body.email},
'phone': {'S': req.body.phone},
'registeredTimestamp': {'S': req.body.registeredTimestamp},
'lastActiveTimestamp': {'S': req.body.lastActiveTimestamp},
'signinType': {'S': req.body.signinType},
'version': {'S': req.body.version},
'markedLocations': {'L': req.body.markedLocations}
};
Run Code Online (Sandbox Code Playgroud)
我检查了 …
我想在Ubuntu 14.04上运行UIExplorer项目.我已经安装了SDK和NDK.我可以运行通常的本地反应项目(我创建的那个),但不是官方回购的例子.
export ANDROID_NDK=/home/bozzmob/android-ndk-r10e/
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 -
任务'执行失败':ReactAndroid:buildReactNdkLib'.
进程'命令'/ home/bozzmob/android-ndk-r10e/ndk-build''以非零退出值2结束
日志看起来像 -
root@purvotara:~/ReactJS/native/react-native# ./gradlew :Examples:UIExplorer:android:app:installDebug
.
.
.
:ReactAndroid:buildReactNdkLib
make: Entering directory `/home/bozzmob/ReactJS/native/react-native/ReactAndroid/src/main/jni/react/jni'
[armeabi-v7a] Compile++ thumb: reactnativejni <= OnLoad.cpp
[armeabi-v7a] SharedLibrary : libfb.so
[armeabi-v7a] SharedLibrary : libglog.so
[armeabi-v7a] StaticLibrary : libdouble-conversion.a
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-> androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short
BFD: /home/bozzmob/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../libexec/gcc/arm-linux-androideabi/4.8/liblto_plugin.so: file too short …Run Code Online (Sandbox Code Playgroud) 说我有一个功能对象 -
setObj : function(a,b){
obj.a = a;
obj.b = b;
}
Run Code Online (Sandbox Code Playgroud)
如果我必须在此函数对象上使用async&await,我该怎么做?
如果在功能(功能方式)中写入相同的内容,请说 -
async function setObj(a,b){
obj.a = a;
obj.b = b;
}
await setObj(2,3);
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,如果是函数对象,我该怎么办呢?
也许标题不是很清楚.这就是我的意思/需要知道的事情 -
如果我在Android应用程序上使用SQLite进行某些数据存储,我可以看到手机中创建的数据库.(/ root/data或我猜的东西).我查看了数据库并执行了一些操作,它有助于开发.
现在,我正在使用反应原生的AsyncStorage API.我的代码存在一些问题,我无法从商店获取存储的数据.不确定我做错了什么.
那么,要查看哪里出错了,有没有办法查看手机上存储的对象列表?如果是这样的话?我该如何看待它?
PS:我正在使用Android Studio的日志调试我的React Native应用程序.因为我在Linux上的Chrome是一个坏男孩(任何帮助将不胜感激)!
在我的反应本机代码中,我在模块中使用bind(this)和var self = this;在多个位置.
两者都解决了this在正确的地方解析关键字的问题.
这是我的代码(2个代码执行相同的功能) -
运用 bind(this)
retval.then(function (argument) {
console.log("argument"+JSON.stringify(argument));
this.stateSetting(argument);
}.bind(this));
Run Code Online (Sandbox Code Playgroud)运用 var self = this
var self = this;
retval.then(function (argument) {
console.log("argument"+JSON.stringify(argument));
self.stateSetting(argument);
});
Run Code Online (Sandbox Code Playgroud)考虑到他们都做同样的工作,我很想知道什么是正确的方法呢?使用其中一个是否有问题?或者有更好的方法吗?
javascript ×7
reactjs ×7
react-native ×5
android ×3
async-await ×3
asynchronous ×2
node.js ×2
android-ndk ×1
babeljs ×1
bind ×1
css ×1
express ×1
immutability ×1
immutable.js ×1
json ×1
performance ×1
promise ×1
this ×1