关于基于Swift创建CocoaPods完全指南和swift创建对象的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于"完全指南:理解API和商品详情的作用和关系"、/usr/local/l
关于基于 Swift 创建 CocoaPods 完全指南和swift创建对象的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于"完全指南:理解API和商品详情的作用和关系"、/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version、/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version&...、Angular $q 完全指南等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 基于 Swift 创建 CocoaPods 完全指南(swift创建对象)
- "完全指南:理解API和商品详情的作用和关系"
- /usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version
- /usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version&...
- Angular $q 完全指南
基于 Swift 创建 CocoaPods 完全指南(swift创建对象)
译者:ckitakishi;校对:mmoaay;定稿:CMB
CocoaPods 是一个面向 Xcode 的项目依赖管理工具。当需要向项目添加库和框架时,它是一项极其有用且值得选择的服务。
试想一下,有人开发了一个足以改变游戏规则、且具有划时代意义的库,并想把它分享给这个世界。这时候该怎么办?长话短说,我要说的是你需要知道如何发布自己的 CocoaPod!
前提
本教程基于 Xcode 8 和 Swift 3。如果你想了解更多关于 Swift 3 的新特性,可以阅读这篇很棒的教程。
译者注:本站译作
目前,CocoaPods 有一个针对 Swift 3 和 Xcode 8 的预发布版本。为了编译基于 Swift 3 的项目,你应该使用这个版本。在终端执行下述命令即可完成安装:
sudo gem install cocoapods --pre
同时你还需要一点 CocoaPods 的使用经验。不妨看看这篇 Gregg Mojica 写的令人惊叹的教程,我相信你会从中了解更多相关的内容。
好了,我们开始!
做一个值得用 Pod 管理的项目
从现在开始,让我们来做一个具有创造性,值得用 pod 管理的项目。我的想法是做一个会缓慢改变颜色的 UIView。我相信对于背景来说这会十分有用。
让我们先从最基础的地方开始。首先,在 Xcode 中创建一个新工程,选择使用 single view 模版。将工程命名为 FantasticView。项目创建之后,添加一个同名的 Swift 文件 FantasticView.swift
。
现在你已经有了 FantasticView.swift
,然后在其中定义一个名为 FantasticView
的类,它继承自 UIView
:
import UIKit class FantasticView : UIView { }
初始化
下一步,为上面定义的类添加两个初始化方法:
override init(frame: CGRect) { super.init(frame: frame) // 核心部分 } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // 你不需要实现这部分 }
第一个初始化方法是 init(frame: CGRect)
。当一个 frame 被传给 FantasticView
的构造函数时该方法会被调用。我们将会在这里调用颜色更改函数。
酷炫的颜色
接下来,定义一个由 UIColor
对象组成的数组 colors
。在我们的核心代码中,将会通过“遍历”这个数组来改变 UIView
的背景颜色。
let colors : [UIColor] = [.red,.orange,.yellow,.green,.blue,.purple]
除此之外,你还需要添加一个计数器对象,在每次颜色改变时计数。
var colorCounter = 0
但是为什么需要一个计数器呢?难道我们不是在遍历颜色数组吗?
注意我刚刚是怎么说“遍历”的
魔法调味剂
现在我要告诉你如何处理遍历颜色数组的问题。
你可能会认为在 UIView
的动画 block 中设置一系列颜色也是一种方法。然而遗憾的是,这无法正常工作,因为最终将只有一种颜色生效。
还有一种方法是创建一个 for 循环,然后在其中运行一个动画 block。这也将遇到先前的问题。要解决这个问题,你可以使用 GCD 来等待动画 block 执行完毕。
但是我坚信有更简单的方法。没错,你可以使用 NSTimer
!
在你的 init(frame: CGRect)
方法中添加下述代码:
let scheduledColorChanged = Timer.scheduledTimer(withTimeInterval: 2.0,repeats: true) { (timer) in //1 UIView.animate(withDuration: 2.0) { //2 self.layer.backgroundColor = self.colors[self.colorCounter % 6].cgColor //3 self.colorCounter+=1 //4 } } scheduledColorChanged.fire() //5
让我们逐行看一看上面的代码:
创建一个
Timer
对象,也就是刚才说的的NSTimer
。为定时器设置一个时间间隔,让它重复执行某些动作。在设置时间间隔之后,我们的定时器将会运行一个代码块。调用
animate(withDuration)
函数。设置
UIView.layer.backgroundColor
。注意,并不是UIView.backgroundColor
,因为layer
属性可动,而UIView
属性不可。计数器加 1。
销毁计时器。
让我们看看第三步中我具体做了什么。通过下标可以从 colors
中取得一个 UIColor
。colorCounter
应该是一个介于 0 到 5 之间的数字,因为这是 colors
数组的界限。我使用 %
或 mod
操作符来求得 colorCounter
除以 6 的余数。所以如果 colorCounter
是 10,则求余得 4,于是此时选择 colors
数组的第四项。
使用 Fantastic View
是时候在我们的主 View Controller 中使用 Fantastic View 了。我希望我的 View Controller 拥有一个酷炫的背景,所以让我们在 ViewController.swift
的 viewDidLoad
方法中插入下列代码:
let fantasticView = FantasticView(frame: self.view.bounds) self.view.addSubview(fantasticView)
这里我们定义了一个 FantasticView
,并使其边框等于 ViewController
的视图边界。然后将 fantasticView
作为子视图添加到主 view
。
好了,在模拟器中运行应用吧!你将会看到随着时间推移,背景也随之改变。
推送到 GitHub
我知道你一定会问:“为什么不将 fantastic view 公布于众呢?人们有必要知道它!”
对,没错。让我们来创建一个 Pod,然后人们就可以使用它了!但是在此之前,需要先将其推送到 GitHub。
CocoaPods 要求 Pod 有一个源。大多数情况下,开发者使用 GitHub 来完成这一切。我们来快速过一遍提交项目到 GitHub 的必要步骤。如果你想知道更多 Git 的基础知识,不妨看一看这篇优秀的教程。
简单来说,下面这些就是你需要做的:
在 Github 上创建一个名为
FantasticView
的仓库。复制仓库的 URL。
打开终端,跳转到你的工程目录下。
初始化 Git:
git init
将所有已修改文件添加到 Git 暂存区中:
git add .
提交这些已修改文件:
git commit -m "init"
添加一个远程库 :
git remote add origin <paste your URL here>
推送到远程分支:
git push -u origin master
现在你必须为你的仓库创建一个 release。一个 release 对应产品的一个新版本。你可以在 Github 的操作面板上尝试创建。首先进入你的仓库。
- 点击
releases
按钮。
- 点击
Create a new release
- 将版本号设置为
0.1.0
,然后输入标题和描述。
- 点击
Publish release
,然后你看所看到的应该与下图相似:
以上是关于 Github 的内容,让我们开始创建 Pod 本身吧!
创建 Pod
首先,我们需要确保已经安装 CocoaPods,并做好在终端使用它的准备。动手吧,打开终端,运行以下命令:
sudo gem install cocoapods --pre
现在 CocoaPods 已经安装完成,下一步轮到创建 Pod 了。
创建 Podspec
所有 Pods 都拥有一个 podspec 文件。podspec,顾名思义,用于定义 Pod 规范!让我们动手创建一个:
打开终端,进入项目根目录。
运行
touch FantasticView.podspec
命令以创建文件。使用编辑器打开文件。
-
将以下代码粘贴到 Podspec 文件中:
pod
Pod::Spec.new do |s|
s.name = ‘FantasticView’
s.version = ‘0.1.0’
s.summary = ‘By far the most fantastic view I have seen in my entire life. No joke.’s.description = <<-DESC
This fantastic view changes its color gradually makes your app look fantastic!DESC
s.homepage = ‘https://github.com/
/FantasticView’
s.license = { :type => ‘MIT’,:file => ‘LICENSE’ }
s.author = { ‘‘ => ‘ ‘ }
s.source = { :git => ‘ https://github.com//FantasticView.git’,:tag => s.version.to_s } s.ios.deployment_target = ‘10.0’
s.source_files = ‘FantasticView/FantasticView.swift’end
s
后面的这些变量都是 CocoaPods 需要的,提供像是名字,版本,概要,描述,仓库,源代码文件等必要信息。
下面介绍几个需要注意的重要变量:
s.name
– 显而易见,他人使用时可以通过该名字将 Pod 添加到项目中。s.version
– 这是你 Pod 的版本。务必注意,它得和 Github release 的版本号相同。如果两者不匹配,就会报错。-
s.summary
和s.description
– 这两个变量最终会显示在 Cocoapods 页面上。请确保description
比summary
更长,否则将会报错。 s.homepage
– 这是 Pod 源代码的 URL。注意将YOUR GITHUB USERNAME
替换为你的用户名哟。s.author
– 开发者信息,注意替换相应内容。-
s.source_files
– 这是最重要的参数。它会告诉 CocoaPods 应该克隆哪些文件。我想要我的FantasticView.swift
被克隆,它的目录是FantasticView/FantasticView.swift
。另外,有很多方法可以添加多个文件作为源代码文件。让我们来看一个例子:├── FantasticView.xcodeproj
└── FantasticView
├── ViewController.swift
├── Info.plist
├── FantasticView.swift
└── FantasticerView.swift
在这个例子中,我希望包含所有 .swift
文件。为达到目的,我会将 source_files
变量设置为洗面这样:
''FantasticView/*.swift''
星号 *
表示包含任意文件。当星号位于文件类型前时,表明包括所有该类型的文件。
假设你想要在 Pod 下载时包含所有位于 /FantasticView
下的文件,只需要将文件名字和类型用星号代替即可:
''FantasticView/*''
这样就涵盖了所有,甚至是其他目录。为了限制文件类型,你也可以使用如下语句:
''FantasticView/*.{swift,plist}''
在这个例子中,将会涵盖所有的 swift
和 plist
文件。
用 Lint 验证项目
CocoaPods 需要验证项目有没有错误,这包含对错误甚至可疑代码的限制和要求。也就是说在发布项目之前 CocoaPods 要求你 lint 你的项目。
lint 一个项目十分简单,但是绝对是难以置信的麻烦!为了 lint 你的项目,请在项目目录下执行以下命令:
pod lib lint
你可能会得到下述警告:
-> FantasticView (0.1.0) - WARN | description: The description is shorter than the summary. - WARN | url: There was a problem validating the URL https://github.com/<YOUR GITHUB USERNAME>/FantasticView.
警告说的很直接。在这个例子中,你应该增加描述内容的长度,并提交一个合法的源代码 URL。一旦发生错误,甚至仅仅只是只是一个警告,CocoaPods 的 lint 就会失败。
再来让我们看看你可能会遭遇的错误:
-> FantasticView (0.1.0) - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use --verbose for more information. - ERROR | [iOS] xcodebuild: /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:13:32: error: type ''UIColor'' has no member ''red'' - ERROR | [iOS] xcodebuild: /Users/sahandedrisian/Desktop/FantasticView/FantasticView/FantasticView.swift:20:37: error: use of unresolved identifier ''Timer''
当真的遇到错误的时候,不要着急,尝试通读错误提示并分析为什么发生这个错误。在本例中,你会注意到下述信息:
type UIColor has no member red.
但是为什么不能识别 UIColor
,事实上存在一个名为 red
的成员呀?
一个合理的猜想是,在 Swift 3.0 中 UIColor.redColor()
已经变为了 UIColor.red
。由此可以推测 CocoaPods,或者具体说是 xcodebuild 编译项目使用的是 swift 2.2 或 2.3。第二个错误也验证了我们的猜想,因为 NSTimer
已经转换为了 Timer
。
那么究竟可以如何修复这个问题呢?CocoaPods 为此发布了一个修正版。在 lint 时你被要求必须指定 Swift 版本。为了这么做,你必须得创建一个名为 .swift-version
的新文件,并添加编译器版本。只需简单地输出以下命令:
echo "3.0" >> .swift-version
现在再次运行 pod lib lint
,你应该能够得到一条通过验证的消息:
-> FantasticView (0.1.0) FantasticView passed validation.
Woohoo!你通过了整个流程中最富挑战的一部分。
注意:如果出现含义不明的错误或警告消息,请尝试键入此命令,pod lib lint -verbose,相比常规的 pod lint 命令,你将得到更详细的信息。
发布你的 Pod
噢,是时候将你的 Fantastic View 发布到 CocoaPods 了。每个开发者都应该拥有一个 CocoaPods 账户,以备发布之时用。
现在的你应该会觉得,CocoaPods 账号就是一个 CocoaPods 账号啊,然而并不是,它是一个 Trunk 账号。我并不是在评判 CocoaPods,但我觉得这是一个十分奇怪的决定,着实让我困惑了一段时间。我这么说了之后,你会不会想读一下他们所写的关于为什么做 Trunk 的博文。
创建 Trunk 账号
确切地说,Trunk 并不是一个账号;是一个会话。所以从根本上来说并不需要密码的存在,需要的仅仅是一个邮箱。
创建流程非常简单:
pod trunk register <Your Email>
你应该很快就会受到一封来自 CocoaPods 的邮件以验证你发起的“会话”。点击邮件提供的链接,完成你的账号验证。之后 CocoaPods 将会给你发来友好的欢迎信息:好棒,设置完成!
推送你的 Pod
到这一步,就只剩下用 Trunk 将你的 podspec 推送到 CocoaPods 了:
pod trunk push FantasticView.podspec
由于我已经抢先一步使用了 FantasticView
这个超级酷炫的名字,它就不再可用了。你应该在 podspec 文件中修改 s.name
,同时不要忘记修改你的 podspec 文件的名字。
完成修改之后,像前一节所演示的一样 lint 你的 podspec,然后再一次推送你的 trunk。若成功推送了你的 Pod,应该会得到以下信息:
Updating spec repo `master` Validating podspec -> FantasticView (0.1.0) Updating spec repo `master` - Data URL: https://raw.githubusercontent.com/CocoaPods/Specs/06dcdf13dd11b8c2eb4fd522b25a652fa654b180/Specs/FantasticView/0.1.0/FantasticView.podspec.json - Log messages: - September 24th,11:08: Push for ''FantasticView 0.1.0'' initiated. - September 24th,11:08: Push for ''FantasticView 0.1.0'' has been pushed (0.500379641 s).
恭喜!回顾所做的一切,并非那么难,对吧?现在可以将 Pod ‘FantasticView’ 添加到你的 podfile 了。
总结
事实上,有几种不同的方式来推送你的 Pod。你也可以使用 CocoaPods 模版来创建 Pod 工程,其中包含示例项目,readme,license 等等。不过我认为这稍有些复杂了,因为它包含了一些不必要的步骤,繁琐,还容易让人困惑。
在本教程中,我创建了一个工程,添加了一个 podspec,解释了 podspec 文件的不同选项,创建了一个 trunk 账号并推送了 Pod。如果遇到了问题,你可以在 CocoaPods 的 Github 仓库提交一个 issue。那是一个非常友好的社区,很酷,他们总是会在最短时间内给出答复。
诚挚地希望你喜欢这篇教程!你可以在这里下载完整项目作为参考。
本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。
"完全指南:理解API和商品详情的作用和关系"
当涉及到电子商务和在线交易时,API和商品详情是两个至关重要的概念。本文将为您提供一个详尽的指南,帮助您全面理解API和商品详情之间的作用和关系。
淘宝/天猫获得淘宝商品详情 API 返回值说明
公共参数
请求地址
名称 | 类型 | 必须 | 描述 |
---|---|---|---|
key | String | 是 | 调用key(必须以GET方式拼接在URL中) |
secret | String | 是 | 调用密钥 |
api_name | String | 是 | API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] |
cache | String | 否 | [yes,no]默认yes,将调用缓存的数据,速度比较快 |
result_type | String | 否 | [json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读 |
lang | String | 否 | [cn,en,ru]翻译语言,默认cn简体中文 |
version | String | 否 | API版本 |
在现代互联网交易中,API(应用程序编程接口)是不可或缺的技术工具。它允许不同的软件系统之间实现数据和功能的交互。通过使用API,电子商务平台可以与第三方服务、应用程序和开发者进行连接,从而实现更多的功能和创新。
API在商品详情方面发挥着重要作用。商品详情是电子商务平台上展示商品信息的关键部分。它包含了商品的描述、特点、规格、价格、库存状态等重要信息。通过API,电商平台可以将商品详情与其他系统集成,如支付系统、物流系统和库存管理系统等。这使得商品详情能够实时更新,并确保准确性和一致性。
API和商品详情之间的关系密不可分。API提供了一种便捷的方式,使得电商平台能够动态地获取和展示商品详情。通过API的调用,平台可以向后端系统请求最新的商品信息,并将其展示给用户。商品详情的更新也可以通过API的方式进行,以确保信息的准确性和一致性。
同时,API还可以扩展商品详情的功能。通过API的调用,电商平台可以利用第三方服务提供的功能来丰富商品详情页,如增加推荐商品、用户评论、社交分享等。这为用户提供了更多的信息和交互方式,提升了购物体验和平台价值。
/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version
问题及分析
今天做项目的时候,执行pod update报了如下错误信息:
/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in
git_version': Failed to extract git version from
git --version("xcrun: error: active developer path (\"/Users/feiwei/Desktop/Xcode.app/Contents/Developer\") does not exist\nUse
sudo xcode-select --switch path/to/Xcode.appto specify the Xcode that you wish to use for command line developer tools, or use
xcode-select --installto install the standalone command line developer tools.\nSee
man xcode-select` for more details.\n") (RuntimeError)
粗略一看,应该是找不到git。为什么找不到?首先,有可能没有安装git;其次,可能是关联路径不对。
解决方案
1.没有安装git
可以在终端执行:xcode-select --install。如果你的电脑系统更新了,有可能这个命令解决不了你的问题,那么,这时候需要到git官网下载安装,下载链接https://git-scm.com/download/mac。
2.关联路径不对
这个问题可以使用命令:sudo xcode-select --switch /Users/feiwei/Downloads/Xcode.app,其实这个命令就是指定Xcode的安装目录。如果你不知道安装路径,或者不想用命令,Xcode -->Preferences-->Locations并选择Command Line Tools,看看是否选择了当前Xcode版本。
简书:
https://www.jianshu.com/u/fa72e27b5006
CSDN:https://blog.csdn.net/xiaocaoyu111
PS:本文原创发于微信公众号longyoung,关注并回复「51电子书」免费领取程序员必读经典电子书。
/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version&...
问题及分析
今天做项目的时候,执行 pod update 报了如下错误信息:
/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in
git_version'': Failed to extract git version from
git --version("xcrun: error: active developer path (\"/Users/feiwei/Desktop/Xcode.app/Contents/Developer\") does not exist\nUse
sudo xcode-select --switch path/to/Xcode.appto specify the Xcode that you wish to use for command line developer tools, or use
xcode-select --installto install the standalone command line developer tools.\nSee
man xcode-select` for more details.\n") (RuntimeError)
粗略一看,应该是找不到 git。为什么找不到?首先,有可能没有安装 git;其次,可能是关联路径不对。
解决方案
1. 没有安装 git
可以在终端执行:xcode-select --install。如果你的电脑系统更新了,有可能这个命令解决不了你的问题,那么,这时候需要到 git 官网下载安装,下载链接 https://git-scm.com/download/mac。
2. 关联路径不对
这个问题可以使用命令:sudo xcode-select --switch /Users/feiwei/Downloads/Xcode.app,其实这个命令就是指定 Xcode 的安装目录。如果你不知道安装路径,或者不想用命令,Xcode -->Preferences-->Locations 并选择 Command Line Tools,看看是否选择了当前 Xcode 版本。
简书:https://www.jianshu.com/u/fa72e27b5006
CSDN:https://blog.csdn.net/xiaocaoyu111
PS:本文原创发于微信公众号 longyoung,关注并回复「51 电子书」免费领取程序员必读经典电子书。
原文出处:https://www.cnblogs.com/longyoung/p/11696339.html
Angular $q 完全指南
如果想使用 $http 或者其他异步操作, 那 $q 是必须要掌握的概念啦. Let''s get started!
如何理解$q, deferred object ?
形象的讲解angular中的$q与promise
假设有一个家具厂,而它有一个VIP客户张先生。
有一天张先生需要一个豪华衣柜,于是,他打电话给家具厂说我需要一个衣柜,回头做好了给我送来,这个操作就叫$q.defer,也就是延期,因为这个衣柜不是现在要的,所以张先生这是在发起一个可延期的请求。
同时,家具厂给他留下了一个回执号,并对他说:我们做好了会给您送过去,放心吧。这叫做promise,也就是承诺。
这样,这个defer算是正式创建了,于是他把这件事记录在自己的日记上,并且同时记录了回执号,这叫做deferred,也就是已延期事件。
现在,张先生就不用再去想着这件事了,该做什么做什么,这就是“异步”的含义。
假设家具厂在一周后做完了这个衣柜,并如约送到了张先生家(包邮哦,亲),这就叫做deferred.resolve(衣柜),也就是“已解决”。而这时候张先生只要签收一下这个(衣柜)参数就行了,当然,这个“邮包”中也不一定只有衣柜,还可以包含别的东西,比如厂家宣传资料、产品名录等。整个过程中轻松愉快,谁也没等谁,没有浪费任何时间。
假设家具厂在评估后发现这个规格的衣柜我们做不了,那么它就需要deferred.reject(理由),也就是“拒绝”。拒绝没有时间限制,可以发生在给出承诺之后的任何时候,甚至可能发生在快做完的时候。而且拒绝时候的参数也不仅仅限于理由,还可以包含一个道歉信,违约金之类的,总之,你想给他什么就给他什么,如果你觉得不会惹恼客户,那么不给也没关系。
假设家具厂发现,自己正好有一个符合张先生要求的存货,它就可以用$q.when(现有衣柜)来把这个承诺给张先生,这件事就立即被解决了,皆大欢喜,张先生可不在乎你是从头做的还是现有的成品,只会惊叹于你们的效率之高。
假设这个家具厂对客户格外的细心,它还可能通过deferred.notify(进展情况)给张先生发送进展情况的“通知”。
这样,整个异步流程就圆满完成,无论成功或者失败,张先生都没有往里面投入任何额外的时间成本。
好,我们再扩展一下这个故事:
张先生这次需要做一个桌子,三把椅子,一张席梦思,但是他不希望今天收到个桌子,明天收到个椅子,后天又得签收一次席梦思,而是希望家具厂做好了之后一次性送过来,但是他下单的时候又是分别下单的,那么他就可以重新跟家具厂要一个包含上述三个承诺的新承诺,这就是$q.all(桌子承诺,椅子承诺,席梦思承诺),
这样,他就不用再关注以前的三个承诺了,直接等待这个新的承诺完成,到时候只要一次性签收了前面的这些承诺就行了。
如何创建 promise -1
$q 支持两种写法, 第一种是类似于ES6标准构造函数写法
$q(function resolver (resolve, reject) {})
注意:
+ ES6 写法并不支持 progress/notify 的回调函数
+ 在构造函数中抛异常也并不会显式的reject the promise
// var iWantResolve = false;
var iWantResolve = true;
function es6promise() {
return $q(function (resolve, reject) {
$timeout(function () {
if (iWantResolve) {
resolve("es6promise resolved");
} else {
reject("es6promise reject");
}
}, 1000)
})
}
promise 的方法
promise.then(successCb, errCb, notifyCb)
其中successCb 将在 promise resolve 后被调用, errCb 将在 promise reject 后被调
notifyCb 将在 deferred.notify 后被调用, 可以多次调用
promise.catch == promise.then(null, errCb), 用于处理之前没有被处理的 rejected promise
promise.finally 将最后被调用, 一般用于资源释放的清理操作
es6promise()
.then(function (data) {
console.log(data);
})
.catch(function (err) {
console.log(err);
});
// if(iWantResolve == true) output: es6promise resolved
// if(iWantResolve = false) output: es6promise reject
如何创建 promise -2
第二种是类似于 commonJS 的写法 $q.deferred()
function commonJsPromise() {
var deferred = $q.defer();
$timeout(function () {
deferred.notify("commonJS notify");
if (iWantResolve) {
deferred.resolve("commonJS resolved");
} else {
deferred.reject("commonJS reject");
}
}, 500);
return deferred.promise;
}
commonJsPromise()
.then(function /** success callback**/(data) {
console.log(data);
}, function /** error callback **/ (err) {
console.log(err);
}, function /** progress callback **/ (update) {
console.log(update);
});
// if(iWantResolve == true) output: commonJS notify commonJS resolved
// if(iWantResolve = false) output: commonJS notify commonJS reject
$q.all
$q.all([promise1, promise1])
接受一个包含若干个 promise 的数组,等所有的 promise resolve 后, 其本身 resolve 包含上述结果的数组 [data1, data2]
如果上述 promise 有一个 reject, 那么$q.all() 会把这个 rejected promise 作为其 rejected promise (只有一个哦)
progress/notify 的 callback 并没有用
$q.all([es6promise(), commonJsPromise()])
.then(function (dataArr) {
console.log("$q.all: ", dataArr);
}, function (err) {
console.log("$q.all: ", err)
}, function /** unnecessary **/ (update) {
console.log("$q.all", update);
});
// if(iWantResolve == true) output: $q.all: ["es6promise resolved", "commonJS resolved"]
// if(iWantResolve = false) output: $q.all: es6promise reject
$q.reject, $q.when, $q.resolve
$q.reject() 立即返回一个rejected 的 promise, 在链式调用的时候很有用
$q.resolve == $q.when(value, successCb, errorCb, progressCb)
value 可能是一个 then-able 的 obj(即可以是 $q.defer() 返回的, 也可以是其他库产生的), 也可能是任意数据, 但是 $q.when 最终都会返回一个 promise
$q.when 既可以写成上述的构造函数形式, 也可以写成 $q.when(value).then(fn, fn, fn) 的形式
$q.reject("instant reject")
.catch(function (err) {
console.log(err);
});
// output: instant reject
$q.when(commonJsPromise(),
function /** success callback **/(data) {
console.log("$q.when success callback function: " + data);
return "$q.when success callback return another value";
})
.then(function (data) {
console.log("$q.when then function:" + data);
});
// if(iWantResolve == true) output:
// $q.when success callback functionL: commonJS resolved
// $q.when then function:$q.when success callback return another value
// if(iWantResolve = false) output:
// $q.when err callback function: commonJS reject
// $q.when then function:undefined
$q.when("some value", function (data){
console.log(data);
})
// output: some value
promise chains 链式调用
任何在 successCb, errCb 中返回的非 $q.reject()对象, 都将成为一个 resolve 的 promise.
所以可以出现如下语法 promise.then().then().then()
$q.when("1")
.then(function (data) {
console.log(data);
return $q.reject(2);
})
.catch(function (err) {
console.log(err);
return 3;
})
.then(function (data) {
console.log(data);
})
// output: 1 2 3
参考资料
AngularJS Documentation for $q
形象的讲解angular中的$q与promise
Angular Promise Chaining Explained
$q.when() Is The Missing $q.resolve() Method In AngularJS
How does Angular $q.when work?
$q.when(promise) calls resolve() instead of reject()
今天的关于基于 Swift 创建 CocoaPods 完全指南和swift创建对象的分享已经结束,谢谢您的关注,如果想了解更多关于"完全指南:理解API和商品详情的作用和关系"、/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version、/usr/local/lib/ruby/gems/2.4.0/gems/cocoapods-1.5.3/lib/cocoapods/command.rb:118:in `git_version&...、Angular $q 完全指南的相关知识,请在本站进行查询。
本文标签: