我正在努力将RxSwift集成到我的项目中
我编写了一个异步网络请求,其结果是在回调闭包上传递。
这是我的网络功能
let webpack = require('webpack'),
path = require('path'),
fs = require('fs'),
manifest = require('./manifest.json'),
{resolve, join} = path,
env = process.env.NODE_ENV;
let plugins = [
new webpack.BannerPlugin(
fs
.readFileSync('./LICENSE')
.toString('utf-8')),
new webpack.DllReferencePlugin({context: __dirname, manifest})
];
// if (env === 'pro') {
// } else {
// plugins.push()
// }
let config = {
// context: resolve(__dirname, 'src'),
entry: {
app: [
'./src/jsx/app.jsx',
'./src/style/app.less'
]
},
output: {
path: resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
devtool: false,
module: {
loaders: [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: [
'stage-2',
'es2015',
'react'
]
}
},{
test: /\.less$/,
loader: 'style!css!autoprefixer!less'
}]
},
resolve: {
extensions: ['', '.js', '.jsx']
},
plugins
}
module.exports = config;
我的问题是我们如何注册观察网络调用结果的func discoverMovies(for url: String, withPage page: Int, success: @escaping(Bool)->()) {
let requestUrl = "\(url)&page=\(page)"
requestGETURL(requestUrl, success: { (json) in
self.createOrUpdateMoviesList(from: json)
success(true)
}) { (error) in
print("Could not download due to \(error)")
success(false)
}
}
(成功是真还是假),以便我们可以根据结果编写额外的句柄(附加代码只会执行网络完成后。)
答案 0 :(得分:3)
我会将你的函数包装成Rx函数:
func discoverMovies(for url: String, withPage page: Int) -> Observable<MoviesList>{
Observable.create{ observer in
let requestUrl = "\(url)&page=\(page)"
self.requestGETURL(requestUrl, success: { (json) in
// your createOrUpdateMoviesList(from:) function returns a MoviesList
let moviesList = self.createOrUpdateMoviesList(from: json)
observer.onNext(moviesList)
observer.onCompleted()
}) { (error) in
print("Could not download due to \(error)")
observer.onError(error)
}
return Disposables.create()
}
}
func otherFunction(withMovies list: MoviesList) -> Observable<Something> {
// blah blah blah...
}
现在,您可以使用flatMap
运算符链接Rx函数:
discoverMovies(for url: "the url", withPage page: 1)
.flatMap{ list in
otherFunction(withMovies: list)
}
.subscribe(onNext:{ something in
// ...
},
onError: { error in
// manage errors
})
如果otherFunction()
取得成功,您可以确定只会调用discoverMovies()
。